题目描述
思路
从后向前遍历每一个字符串的每一个字符,直到走完所有位,比如两个字符串分别是a="101" 和 b="11"
则第一次取a的最后一位1和b的最后一位1,初始没有进位,则进位为0,相加为2,变为0,进一位,总结起来就是:
每个字符串各取一位相加,然后再加上进位(如果有为1,没有为0),得到的值设为x,x / 2即为新的进位,x % 2即为相加之后当前位更新之后的值。
代码实现
class Solution {
public:
string addBinary(string a, string b) {
int a_len = a.size() - 1, b_len = b.size() - 1;
int carry = 0; // 初始进位值
string res;
while (a_len >= 0 || b_len >= 0) {
// 分别从后向前遍历每一个字符串的对应每一个字符
// a_len b_len 对应字符串的下标,最大即为size() - 1,最小为0
int sum = carry;
if (a_len >= 0) {
sum += a[a_len--] - '0'; // 注意这里一定要--,不然死循环
}
if (b_len >= 0) {
sum += b[b_len--] - '0';
}
carry = sum / 2;
// 不要写成res.append(sum % 2 == 0 ? "0" : "1"),否则需要倒转过来
res = (sum % 2 == 0 ? "0" : "1") + res;
}
// 考虑到最后可能还有进位,需要额外的1来填充
if (carry == 1) {
res = "1" + res;
}
return res;
}
};