问题
Given two binary strings, return their sum (also a binary string).
例子
a = "11"
b = "1"
Return "100".
分析
- 方法一:同时遍历两个字符串,当一个字符串遍历完毕的时候再遍历另一个字符串剩下的部分。注意位数和进位的计算可以使用位运算;
- 方法二:将字符串的遍历和最后进位的处理合并到一个循环中。
要点
- 考虑进位;
- 尽量让代码简洁明了。
时间复杂度
O(m+n),m和n是两个二进制字符串的个数。
空间复杂度
O(1)
代码
方法一
class Solution {
public:
string addBinary(string a, string b) {
string res(max(a.size(), b.size()) + 1, '0');
int i = a.size() - 1, j = b.size() - 1, sum = 0, carry = 0, cnt = 0;
while (i >= 0 && j >= 0) {
sum = (a[i] - '0') + (b[j] - '0') + carry;
carry = sum >> 1;
sum = sum & 1;
res[res.size() - 1 - cnt++] = sum + '0';
i--; j--;
}
while (i >= 0) {
sum = (a[i] - '0') ^ carry;
carry = (a[i] - '0') & carry;
res[res.size() - 1 - cnt++] = sum + '0';
i--;
}
while (j >= 0) {
sum = (b[j] - '0') ^ carry;
carry = (b[j] - '0') & carry;
res[res.size() - 1 - cnt++] = sum + '0';
j--;
}
if (carry == 1) res[res.size() - 1 - cnt++] = '1';
else res.erase(0, 1);
return res;
}
};
方法二
class Solution {
public:
string addBinary(string a, string b) {
string res;
int i = a.size() - 1, j = b.size() - 1, c = 0;
while (i >= 0 || j >= 0 || c == 1) {
c += i >= 0 ? a[i--] - '0' : 0;
c += j >= 0 ? b[j--] - '0' : 0;
res = (char)((c & 1) + '0') + res;
c >>= 1;
}
return res;
}
};