67. 二进制求和(简单)
思路
- 这道题很简单,和415. 字符串相加 是一样的思路。
- 首先对较短的字符串前面补 0 ,保证两个字符串长度一致;
- 接着对两个字符串从右到左将对应位置的数字相加 (从右到左,也就是下标要从最大值 -> 0) ,当然,如果上一个位置发生了进位,在这个结果上还需要
+1
; 如果得到的数字 >= 2 ,说明该位置发生了进位,那么这个位置上的数字对 2 取余,并且将进位值add
标记为 1 。 - 最后,还需要单独考虑最高位是否发生了进位,同样地,如果发生了进位,在这个结果上还需要
+1
。 - 最终结果需要将字符串
ans
进行翻转。
代码
class Solution {
public:
string addBinary(string a, string b) {
string ans;
// 使得a一定是较长的字符串
if(a.size() < b.size()) swap(a, b);
int len_a = a.size(), len_b = b.size();
// 对较短的字符串补0
for(int i=len_b; i<len_a; ++i){
b = "0" + b;
}
int add = 0; // 进位
// 对应位置的数字相加
for(int i=len_a-1; i>=0; --i){
int temp = a[i] - '0' + b[i] - '0' + add;
add = 0;
// 需要进位
if(temp >= 2){
temp = temp % 2;
add = 1;
}
ans.push_back(temp + '0');
}
if(add) ans.push_back('1');
reverse(ans.begin(), ans.end());
return ans;
}
};