力扣第67题 二进制求和 c++代码 简单易懂
题目
简单
给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
示例 1:
输入:a = "11", b = "1" 输出:"100"
示例 2:
输入:a = "1010", b = "1011" 输出:"10101"
提示:
1 <= a.length, b.length <= 104a和b仅由字符'0'或'1'组成- 字符串如果不是
"0",就不含前导零
思路
- 首先,我们需要将两个输入字符串的长度补齐,使得它们的长度相等。如果某个字符串长度较短,我们可以在该字符串的左侧插入适当数量的字符 '0',使其与另一个字符串长度相等。
- 创建一个变量 carry,用于表示进位值,初始值为 0。
- 从右往左遍历两个输入字符串的每一位:
- 将当前位转换为整数,并与另一个字符串的对应位以及进位值相加,得到当前位的和 sum。
- 将 sum 对2取余,得到当前位的结果(0或1)。
- 将结果转换为字符后,将其放置在结果字符串的最左侧。
- 更新进位值 carry,将 sum 除以 2 的商赋值给 carry。
- 如果遍历完成后 carry 的值大于 0,则表示有进位,将字符 '1' 放置在结果字符串的最左侧。
- 最终,我们得到的结果就是两个二进制字符串的和。
解题方法
- 从右往左遍历两个二进制数,逐位相加,同时考虑进位的情况。具体地,对于两个二进制数的同一位,如果它们的和小于等于1,则直接将其加入结果字符串中;否则,将其减去2后加入结果字符串,并记录下一位的进位。
- 如果有一个二进制数已经遍历完了,那么我们只需要将另一个二进制数剩余的部分以及进位依次加入结果字符串即可。
- 将得到的结果字符串反转,就得到了两个二进制数的和。
复杂度
时间复杂度:
O(n)
其中n是a和b中较长的字符串的长度。这是因为我们需要遍历较长的字符串,执行逐位相加的操作。
空间复杂度
O(1)
因为我们只使用了常数级别的额外空间来保存进位和中间结果,并没有使用额外的动态空间。
c++ 代码
class Solution {
public:
string addBinary(string a, string b) {
// 将较短的字符串前面补0,使得两个字符串长度相等
if (a.length() >= b.length()) {
b.insert(0, a.length() - b.length(), '0');
} else {
a.insert(0, b.length() - a.length(), '0');
}
int len = max(a.length(), b.length()); // 字符串的长度
int carry = 0; // 进位
for (int i = len - 1; i >= 0; i--) {
int sum = a[i] - '0' + b[i] - '0' + carry; // 当前位的和
a[i] = (sum) % 2 + '0'; // 更新当前位的值为sum模2的结果
carry = sum / 2; // 计算进位
}
if (carry > 0) {
a = '1' + a; // 如果最高位有进位,将进位加在最高位
}
return a;
}
};
浙公网安备 33010602011771号