给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
示例 1:
输入:a = “11”, b = “1”
输出:“100”
示例 2:
输入:a = “1010”, b = “1011”
输出:“10101”
提示:
1 <= a.length, b.length <= 104
a 和 b 仅由字符 ‘0’ 或 ‘1’ 组成
字符串如果不是 “0” ,就不含前导零
思路
首先,如果输入的两个字符串中有一个为"0",那么直接返回另一个字符串,因为0加任何数都等于那个数。
然后,将两个输入字符串进行逆序,这样可以从最低位(字符串的第一个字符)开始进行二进制相加。
接下来,定义一个bitset变量,长度为10007,用于存储计算过程中的进位和结果。
在进行三个循环的过程中,通过比较字符是否等于’1’来将字符转换为布尔值。
第一个循环处理两个字符串共有的部分,即两个字符串都有字符的部分。在这个循环中,使用位运算符(&、|、^ )进行二进制加法运算,其中,"&“和”|“运算用于计算进位,”^"运算用于计算当前位的结果。
第二个和第三个循环处理两个字符串长度不等的情况,即只有一个字符串还有字符的部分。这两个循环的处理方式和第一个循环类似,只不过只需要处理一个字符串。
最后,将bitset转换为字符串,然后找到第一个非’0’字符的位置,从这个位置开始,截取字符串的剩余部分,这就是最终的结果。
AC代码
/*
* @lc app=leetcode.cn id=67 lang=cpp
*
* [67] 二进制求和
*/
// @lc code=start
class Solution {
public:
string addBinary(string a, string b) {
if (a == "0") {
return b;
}
if (b == "0") {
return a;
}
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
const int N = 1e4 + 7;
bitset<N> bs;
int i;
for (i = 0; i < a.length() && i < b.length(); i++) {
bool x = a[i] == '1';
bool y = b[i] == '1';
bs[i + 1] = (x & y) | (bs[i] & (x ^ y));
bs[i] = x ^ y ^ bs[i];
}
for (; i < a.length(); i++) {
bool x = a[i] == '1';
bool y = bs[i];
bs[i + 1] = x & y;
bs[i] = x ^ y;
}
for (; i < b.length(); i++) {
bool x = b[i] == '1';
bool y = bs[i];
bs[i + 1] = x & y;
bs[i] = x ^ y;
}
string c0 = bs.to_string();
int index = c0.find_first_not_of('0');
string c = c0.substr(index);
return c;
}
};
// @lc code=end