67.二进制求和

给你两个二进制字符串,返回它们的和(用二进制表示)。

输入为 非空 字符串且只包含数字 10

示例 1:

1
2
输入: a = "11", b = "1"
输出: "100"

Solution

模仿手算,用一个变量来表示进位

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Solution {
// addBinary方法接受两个字符串a和b,代表两个二进制数,返回它们的和(也是一个二进制字符串)
public String addBinary(String a, String b) {

// 如果字符串a为空或长度为0,直接返回b作为结果
if(a == null || a.length() == 0) return b;
// 如果字符串b为空或长度为0,直接返回a作为结果
if(b == null || b.length() == 0) return a;

// 使用StringBuilder来构建最终的二进制和字符串
StringBuilder stb = new StringBuilder();
// i和j分别指向a和b的最后一个字符(即最低位)
int i = a.length() - 1;
int j = b.length() - 1;

int c = 0; // 用于记录进位的变量,初始值为0

// 当任一字符串还有未处理的位时,继续循环
while(i >= 0 || j >= 0) {
// 如果a还有位未处理,将其加到c上,并将i递减(向高位移动)
if(i >= 0) c += a.charAt(i--) - '0';
// 如果b还有位未处理,将其加到c上,并将j递减(向高位移动)
if(j >= 0) c += b.charAt(j--) - '0';
// 将c模2的结果添加到stb中,这是因为二进制加法中0+0=0, 1+0=1, 1+1=10(结果是0,进位是1)
stb.append(c % 2);
// 将c右移1位,相当于c除以2,用于计算进位
c >>= 1;
}

// 逆转stb以得到正确的二进制和,然后转换成字符串
String res = stb.reverse().toString();
// 如果最后还有进位(c>0),则将这个进位添加到结果字符串的最前面
return c > 0 ? '1' + res : res;
}
}