题目大意:
二进制求和
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1
和 0
。
示例 1:
输入: a = "11", b = "1" 输出: "100"
示例 2:
输入: a = "1010", b = "1011" 输出: "10101"
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=67
解题思路分析:
这是一道简单的二进制加法运算题。与十进制加法相同,我们从低位开始,相同位上的数字相加,同时还要加上前一位的进位数,他们的和与2的余数即是当前位上的数字,与2的商是进位数(进到下一位)。所有位上的数字加完之后,不要忘记查看进位数是否大于0,如果是,则需要将进位数设置到最高位上。
实现代码:
public String addBinary(String a, String b) { // 数字a的最低位 int indexA = a.length()-1; // 数字b的最低位 int indexB = b.length()-1; // 返回结果 StringBuilder sb = new StringBuilder(); // 进位数 int carry=0; // 从最低位开始循环累加2个数字上的所有位数 while(indexA>=0||indexB>=0){ // 数字a当前位上的数,如果已经超过最高位,当前数为0 int n1=indexA>=0?a.charAt(indexA)-'0':0; // 数字b当前位上的数,如果已经超过最高位,当前数为0 int n2=indexB>=0?b.charAt(indexB)-'0':0; // 当前位上的和 int sum=n1+n2+carry; // 和与2的余数为当前位 int num=sum%2; // 和与2的商为进位数 carry=sum/2; // 将当前位加到返回结果的最高位 sb.insert(0,num); // 两个数字均向高位进一位 indexA--; indexB--; } // 如果进位大于0,将进位加到返回结果最高位 if(carry>0) sb.insert(0,1); // 将返回结果转为字符串返回 return sb.toString(); }
本题解法执行时间为2ms。
Runtime: 2 ms, faster than 77.75% of Java online submissions for Add Binary.
Memory Usage: 38.6 MB, less than 5.62% of Java online submissions for Add Binary.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/leetcode-67-add-binary-解题思路分析/