题目链接: 二进制求和
有关题目
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
提示:
每个字符串仅由字符 '0' 或 '1' 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 "0" ,就都不含前导零。
题解
法一:模拟
模拟,逢二进一
为保证位数对齐,我们将a,b反转, 以a,b中长度最长的为界限,从前往后遍历
最后注意,验证最后进位的
代码一:
class Solution {
public:
string addBinary(string a, string b) {
string ans = "";
reverse(begin(a), end(a));
reverse(begin(b), end(b));
int n = max(a.size(), b.size()), add = 0;
for (int i = 0; i < n; ++i){
int x = i < a.size() ? a[i] - '0' : 0;
int y = i < b.size() ? b[i] - '0' : 0;
int res = x + y + add;
ans.push_back(res % 2 + '0');
add = res / 2;
}
if (add != 0){
ans.push_back(add % 2 + '0');
}
reverse(begin(ans), end(ans));
return ans;
}
};
代码二:
思路:
这次我们从后往前遍历,逢二进一,最后别忘记反转一下
class Solution {
public:
string addBinary(string a, string b) {
int m = a.size() - 1, n = b.size() - 1, add = 0;
string ans = "";
while(m >= 0 || n >= 0 || add){
int x = m >= 0 ? a[m] - '0' : 0;
int y = n >= 0 ? b[n] - '0' : 0;
int res = x + y + add;
ans.push_back(res % 2 + '0');
add = res / 2;
--m, --n;
}
reverse(ans.begin(), ans.end());
return ans;
}
};