给你两个二进制字符串 a
和 b
,以二进制字符串的形式返回它们的和。
简单
点击在LeetCode中查看题目
输入:a = “11”, b = “1”
输出:“100”
解释:11 + 1 = 100(二进制)
输入:a = “1010”, b = “1011”
输出:“10101”
解释:1010 + 1011 = 10101(二进制)
1 <= a.length, b.length <= 10^4
a
和 b
仅由字符 '0'
或 '1'
组成"0"
,就不含前导零这道题的关键是模拟二进制加法的过程,需要注意以下几点:
具体步骤:
步骤 | 操作 | 状态 | 说明 |
---|---|---|---|
初始 | 输入 | a=“11”, b=“1” | 原始输入 |
第1步 | 1+1 | sum=2, carry=1 | 最右位相加 |
第2步 | 1+0+carry | sum=2, carry=1 | 次右位加进位 |
第3步 | 0+0+carry | sum=1, carry=0 | 处理最后进位 |
情况 | 输入 | 输出 | 说明 |
---|---|---|---|
基本情况 | “11”+“1” | “100” | 有进位 |
无进位 | “1”+“1” | “10” | 简单相加 |
多位进位 | “111”+“111” | “1110” | 连续进位 |
public class Solution {
public string AddBinary(string a, string b) {
StringBuilder result = new StringBuilder();
int carry = 0;
int i = a.Length - 1;
int j = b.Length - 1;
// 从右向左遍历两个字符串
while (i >= 0 || j >= 0 || carry > 0) {
int sum = carry;
// 获取a的当前位
if (i >= 0) {
sum += a[i] - '0';
i--;
}
// 获取b的当前位
if (j >= 0) {
sum += b[j] - '0';
j--;
}
// 添加当前位的结果
result.Insert(0, sum % 2);
// 更新进位
carry = sum / 2;
}
return result.ToString();
}
}
class Solution:
def addBinary(self, a: str, b: str) -> str:
result = []
carry = 0
i = len(a) - 1
j = len(b) - 1
# 从右向左遍历两个字符串
while i >= 0 or j >= 0 or carry:
total = carry
# 获取a的当前位
if i >= 0:
total += int(a[i])
i -= 1
# 获取b的当前位
if j >= 0:
total += int(b[j])
j -= 1
# 添加当前位的结果
result.append(str(total % 2))
# 更新进位
carry = total // 2
return ''.join(result[::-1])
class Solution {
public:
string addBinary(string a, string b) {
string result;
int carry = 0;
int i = a.length() - 1;
int j = b.length() - 1;
// 从右向左遍历两个字符串
while (i >= 0 || j >= 0 || carry > 0) {
int sum = carry;
// 获取a的当前位
if (i >= 0) {
sum += a[i] - '0';
i--;
}
// 获取b的当前位
if (j >= 0) {
sum += b[j] - '0';
j--;
}
// 添加当前位的结果
result = to_string(sum % 2) + result;
// 更新进位
carry = sum / 2;
}
return result;
}
};
解法 | 时间复杂度 | 空间复杂度 | 优点 | 缺点 |
---|---|---|---|---|
字符串模拟 | O(max(n,m)) | O(max(n,m)) | 直观易懂 | 需要额外空间 |
内置函数 | O(n) | O(1) | 代码简短 | 不符合面试要求 |
位运算 | O(n) | O(1) | 性能最优 | 实现复杂 |