LeetCode 67. 二进制求和 学习笔记(Java)
2021/4/16 12:26:13
本文主要是介绍LeetCode 67. 二进制求和 学习笔记(Java),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、题目
-
原题链接
-
描述:
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。 -
示例1
输入: a = “11”, b = “1”
输出: “100” -
示例2
输入: a = “1010”, b = “1011”
输出: “10101”
二、题解
-
思路:
1.将a,b反转;
2.反转后如果不等长,则在短的末尾补0;
3.由于要反转后相加,因此计算规则为【各位相加,向后进位】;
4.判断相加后的数最后一位是不是要进位,进位则在最后添加一位为1,不进位则在最后添加一位为0;
5.判断添加一位后的数的最后一位是否为0,若为0则应去掉;
6.反转。 -
注意点
1.注意String类型与int数组类型之间的转换;
2.使用【mark】标记该位的两数相加后是否要向后进位;
三、代码(Java)
class Solution{ public String addBinary(String a, String b){ //反转a、b String aReverse = new StringBuffer(a).reverse().toString(); String bReverse = new StringBuffer(b).reverse().toString(); int aLen = a.length(); int bLen = b.length(); //转换为String数组 String[] aReverseArr = aReverse.split(""); String[] bReverseArr = bReverse.split(""); //String数组转换为int数组 int[] aReverseIntArr = new int[aLen]; int[] bReverseIntArr = new int[bLen]; for(int i=0; i<aLen; i++){ aReverseIntArr[i] = Integer.parseInt(aReverseArr[i]); } for(int i=0; i<bLen; i++){ bReverseIntArr[i] = Integer.parseInt(bReverseArr[i]); } //反转后的int数组在末尾补零 int[] newA = new int[Math.max(aLen,bLen)]; int[] newB = new int[Math.max(aLen,bLen)]; if(aLen<bLen){ for(int i = 0; i<aLen; i++){ newA[i] = aReverseIntArr[i]; newB[i] = bReverseIntArr[i]; } for(int i = aLen; i<bLen; i++){ newA[i] = 0; newB[i] = bReverseIntArr[i]; } }else if(aLen>bLen){ for(int i = 0; i<bLen; i++){ newA[i] = aReverseIntArr[i]; newB[i] = bReverseIntArr[i]; } for(int i = bLen; i<aLen; i++){ newA[i] = aReverseIntArr[i]; newB[i] = 0; } }else { for(int i=0; i<aLen; i++) { newA[i] = aReverseIntArr[i]; newB[i] = bReverseIntArr[i]; } } int[] ansInt = new int[newA.length+1]; //初始mark置0 int mark = 0; //各位相加,向后进位 for(int i=0; i<newA.length; i++){ switch(mark+newA[i]+newB[i]) { case 0: mark = 0; ansInt[i] = 0; break; case 1: mark = 0; ansInt[i] = 1; break; case 2: mark = 1; ansInt[i] = 0; break; case 3: mark = 1; ansInt[i] = 1; break; } } //判断最后一位是否要进位 if(mark==1){ ansInt[ansInt.length-1] = 1; } //反转ansInt int[] ansIntReverse = new int[ansInt.length]; for(int i=0; i<ansInt.length; i++){ ansIntReverse[i] = ansInt[ansInt.length-1-i]; } //int数组类型转为String类型 //若首位是0则去除 StringBuffer sb = new StringBuffer(); if(ansIntReverse[0]==0) { for(int i=1; i<ansIntReverse.length; i++) { sb.append(ansIntReverse[i]); } }else { for(int num: ansIntReverse){ sb.append(num); } } return sb.toString(); } }
四、总结
- 几乎是第一次完全自己写出来的一题;
- 转换过程很繁琐,有待优化;
- 计算部分,if语句有时不太直观,这里由于二进制下的各位相加情况比较少,换成了更清晰直观的switch语句
这篇关于LeetCode 67. 二进制求和 学习笔记(Java)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-11cursor试用出现:Too many free trial accounts used on this machine 的解决方法
- 2025-01-11百万架构师第十四课:源码分析:Spring 源码分析:深入分析IOC那些鲜为人知的细节|JavaGuide
- 2025-01-11不得不了解的高效AI办公工具API
- 2025-01-102025 蛇年,J 人直播带货内容审核团队必备的办公软件有哪 6 款?
- 2025-01-10高效运营背后的支柱:文档管理优化指南
- 2025-01-10年末压力山大?试试优化你的文档管理
- 2025-01-10跨部门协作中的进度追踪重要性解析
- 2025-01-10总结 JavaScript 中的变体函数调用方式
- 2025-01-10HR团队如何通过数据驱动提升管理效率?6个策略
- 2025-01-10WBS实战指南:如何一步步构建高效项目管理框架?