问题概述
给定两个二进制字符串 a 和 b,返回它们的和作为二进制字符串。
解法 1:简单方法
工作原理
从右到左(从最低位到最高位)处理数字,添加对应数字并处理进位:
python
class Solution:
def addBinary(self, a, b):
result = []
carry = 0
i = len(a) - 1
j = len(b) - 1
while i >= 0 or j >= 0 or carry:
total = carry
if i >= 0:
total += int(a[i])
i -= 1
if j >= 0:
total += int(b[j])
j -= 1
result.append(str(total % 2))
carry = total // 2
return ''.join(reversed(result))
复杂度分析
- 时间复杂度: O(max(m, n)) - 每个数字处理一次
- 空间复杂度: O(max(m, n)) - 用于结果字符串
何时使用
- 易于理解和实现
- 适合学习算法逻辑
- 处理所有情况,包括进位传播
解法 2:内置函数(推荐)
工作原理
使用 Python 的内置函数 int() 和 bin() 将二进制字符串转换为整数,相加后再转换回二进制:
int(x, 2): 将二进制字符串x转换为整数。第二个参数2指定基数为 2(二进制)。bin(x): 将整数x转换为带'0b'前缀的二进制字符串。我们使用切片[2:]来移除前缀。
python
class Solution:
def addBinary(self, a, b):
x = bin(int(a, 2) + int(b, 2))
return x[2:]
复杂度分析
- 时间复杂度 : O(max(m, n)) -
int(x, 2)为 O(n),其中 n 为字符串长度;bin(x)为 O(n),其中 n 为二进制字符串长度 - 空间复杂度: O(max(m, n)) - 用于结果字符串
何时使用
- 推荐 - 最快且最简洁
- 利用高度优化的 C 实现
- 由于优化的内置函数,实际性能最佳
对比
| 方法 | 时间 | 空间 | 最佳适用 |
|---|---|---|---|
| 简单方法 | O(max(m,n)) | O(max(m,n)) | 逻辑清晰,易于理解 |
| 内置函数 | O(max(m,n)) | O(max(m,n)) | 性能最佳,代码最简洁 |
总结
关键是从右到左处理数字,添加对应数字并传播进位。进位可以是 0 或 1,我们继续处理直到两个字符串都处理完毕且没有剩余进位。解法 1 手动实现,逻辑清晰;解法 2 利用 Python 优化的内置函数,性能最佳。两种解法都实现了 O(max(m, n)) 的时间复杂度和空间复杂度。