给定两个二进制字符串,返回它们的和(也是一个二进制字符串)。
输入为非空字符串且只包含数字 1
和 0
。
输入: a = "11", b = "1"
输出: "100"
输入: a = "1010", b = "1011"
输出: "10101"
def addBinary(a, b):
"""
使用模拟二进制加法的方法计算二进制字符串的和
:param a: str, 第一个二进制字符串
:param b: str, 第二个二进制字符串
:return: str, 二进制求和结果
"""
i, j, carry, result = len(a) - 1, len(b) - 1, 0, []
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
carry = total // 2
result.append(str(total % 2))
return ''.join(result[::-1])
# 示例调用
print(addBinary("11", "1")) # 输出: "100"
print(addBinary("1010", "1011")) # 输出: "10101"
n
和 m
分别是两个字符串的长度,因为我们需要迭代每个字符串一次。int
函数将二进制字符串转换为十进制整数。def addBinary(a, b):
"""
使用内置函数转换方法计算二进制字符串的和
:param a: str, 第一个二进制字符串
:param b: str, 第二个二进制字符串
:return: str, 二进制求和结果
"""
return bin(int(a, 2) + int(b, 2))[2:]
# 示例调用
print(addBinary("11", "1")) # 输出: "100"
print(addBinary("1010", "1011")) # 输出: "10101"
n
和 m
是两个字符串的长度。转换过程和加法操作的时间复杂度为线性。def addBinary(a, b):
"""
使用位操作模拟二进制加法
:param a: str, 第一个二进制字符串
:param b: str, 第二个二进制字符串
:return: str, 二进制求和结果
"""
result, carry = [], 0
i, j = len(a) - 1, len(b) - 1
while i >= 0 or j >= 0 or carry:
if i >= 0:
carry += int(a[i])
i -= 1
if j >= 0:
carry += int(b[j])
j -= 1
result.append(str(carry % 2))
carry //= 2
return ''.join(result[::-1])
# 示例调用
print(addBinary("11", "1")) # 输出: "100"
print(addBinary("1010", "1011")) # 输出: "10101"
def addBinary(a, b):
"""
使用递归方法计算二进制字符串的和
:param a: str, 第一个二进制字符串
:param b: str, 第二个二进制字符串
:return: str, 二进制求和结果
"""
if not a:
return b
if not b:
return a
if a[-1] == '1' and b[-1] == '1':
return addBinary(addBinary(a[:-1], b[:-1]), '1') + '0'
if a[-1] == '0' and b[-1] == '0':
return addBinary(a[:-1], b[:-1]) + '0'
else:
return addBinary(a[:-1], b[:-1]) + '1'
# 示例调用
print(addBinary("11", "1")) # 输出: "100"
print(addBinary("1010", "1011")) # 输出: "10101"
def addBinary(a, b):
"""
反转字符串后进行迭代计算二进制字符串的和
:param a: str, 第一个二进制字符串
:param b: str, 第二个二进制字符串
:return: str, 二进制求和结果
"""
a, b = a[::-1], b[::-1]
result = []
carry = 0
i = 0
while i < len(a) or i < len(b) or carry:
total = carry
if i < len(a):
total += int(a[i])
if i < len(b):
total += int(b[i])
result.append(str(total % 2))
carry = total // 2
i += 1
return ''.join(result[::-1])
# 示例调用
print(addBinary("11", "1")) # 输出: "100"
print(addBinary("1010", "1011")) # 输出: "10101"
特征 | 方法一: 模拟加法 | 方法二: 转换加法 | 方法三: 位操作 | 方法四: 递归 | 方法五: 反转迭代 |
---|---|---|---|---|---|
时间复杂度 | (O(max(n, m))) | (O(n + m)) | (O(max(n, m))) | (O(n + m)) | (O(max(n, m))) |
空间复杂度 | (O(max(n, m))) | (O(1)) | (O(max(n, m))) | (O(n + m)) | (O(max(n, m))) |
优势 | 直接明了,处理逻辑清晰 | 计算快速,适合长度较短的字符串 | 位操作符合二进制加法的本质 | 递归逻辑清晰,易于理解 | 反转后迭代符合直觉,易于实现 |
劣势 | 较多的迭代和条件判断 | 需要处理较大的整数转换 | 代码复杂度较高,需处理多种边界情况 | 对于大字符串,递归可能导致栈溢出 | 额外的字符串反转操作增加了计算步骤 |
通信系统:
在数字通信系统中,二进制数据的处理是基本需求。这些算法可以用于实现错误检测与纠正算法中的简单二进制计算,如奇偶校验位的计算。选择合适的算法可以优化通信协议的实现,提高数据传输的可靠性和效率。