67.二进制求和
题目分析
本题采用模拟法解决,首先确定二进制加法的基本法则:
1 + 1 = 10
1 + 0 = 01
0 + 0 = 00
所以我们可以从两个字符串的最后一位开始遍历,按照上面的法则运算,为了表示进位,我们需要定义一个进位符flag
,有进位时,令flag = 1
;没有进位时,令flag = 0
。
同时,为了方便运算,我们可以令两个字符串等长,其实操作也很简单,只要在短的字符串前面加0
字符即可。
int len_a = a.length();
int len_b = b.length();
if (len_a < len_b) swap(a, b);
while (b.length() < a.length()) {
b = '0' + b;
}
然后定位进位符flag = 0
, 从i = a.length() - 1
开始遍历,遍历的情况:
- 当
a[i] = 1 && b[i] = 1
时- 如果
flag = 1
,令temp = 1
; - 如果
flag = 0
,令temp = 0, flag = 1
;
- 如果
- 当
a[i] = 0 && b[i] = 0
时- 如果
flag = 1
,令temp = 1, flag = 0
; - 如果
flag = 0
,令temp = 0
;
- 如果
- 当
a[i] = 1 || b[i] = 1
时- 如果
flag = 1
,令temp = 0
; - 如果
flag = 0
,令temp = 1
;
- 如果
- 一轮遍历结束,
res = temp + res
;
遍历结束后,如果flag = 1
,在结果前加字符1
。
题目解答
class Solution {
public:
string addBinary(string a, string b) {
int len_a = a.length();
int len_b = b.length();
if (len_a < len_b) swap(a, b);
while (b.length() < a.length()) {
b = '0' + b;
}
string res;
int it = a.length();
int flag = 0;
for (int i = it - 1; i >= 0; i--) {
char temp;
if (a[i] == '1' && b[i] == '1') {
if (flag == 1) temp = '1';
else {
temp = '0';
flag = 1;
}
} else if (a[i] == '0' && b[i] == '0') {
if (flag == 1) {
temp = '1';
flag = 0;
}else temp = '0';
} else if (a[i] == '1' || b[i] == '1') {
if (flag == 1) {
temp = '0';
}else temp = '1';
}
// printf("%c %c %d %c\n", a[i], b[i], flag, temp);
res = temp + res;
}
if (flag == 1) res = '1' + res;
return res;
}
};