【力扣 67】二进制求和 C++题解(位运算+模拟+字符串+位集合)

给你两个二进制字符串 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

你可能感兴趣的:(Algorithm,Problems,leetcode,c++,java)