一.题目要求
给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
示例一
![](https://i-blog.csdnimg.cn/blog_migrate/9393bee68513f2929b7f9845beaca3d3.png)
示例二
![](https://i-blog.csdnimg.cn/blog_migrate/4d05196face88ee3f9d56ee41eb6e999.png)
提示
![](https://i-blog.csdnimg.cn/blog_migrate/10335289d4ebc9936658b9ef3a26861f.png)
二.解题思路
考虑一个最朴素的方法:先将 aa 和 bb 转化成十进制数,求和后再转化为二进制数。
我们可以借鉴「列竖式」的方法,末尾对齐,逐位相加。在十进制的计算中「逢十进一」,二进制中我们需要「逢二进一」。
具体的,我们可以取 n = max{ |a|, |b| },循环 n 次,从最低位开始遍历。我们使用一个变量 carry 表示上一个位置的进位,初始值为 0。记当前位置对其的两个位为 ai和 bi ,则每一位的答案为 (carry+ai+bi)mod2,下一位的进位为 [(carry+ai+bi)/2]重复上述步骤,直到数字 a 和 b 的每一位计算完毕。最后如果 carry 的最高位不为 0,则将最高位添加到计算结果的末尾。
注意,为了让各个位置对齐,你可以先反转这个代表二进制数字的字符串,然后低下标对应低位,高下标对应高位。当然你也可以直接把 a 和 b 中短的那一个补 0 直到和长的那个一样长,然后从高位向低位遍历,对应位置的答案按照顺序存入答案字符串内,最终将答案串反转。这里的代码给出第一种的实现。
三.代码
class Solution {
public String addBinary(String a, String b) {
StringBuffer ans = new StringBuffer();
int n = Math.max(a.length(), b.length()), carry = 0;
for (int i = 0; i < n; ++i) {
carry += i < a.length() ? (a.charAt(a.length() - 1 - i) - '0') : 0;
carry += i < b.length() ? (b.charAt(b.length() - 1 - i) - '0') : 0;
ans.append((char) (carry % 2 + '0'));
carry /= 2;
}
if (carry > 0) {
ans.append('1');
}
ans.reverse();
return ans.toString();
}
}