题目
给你两个二进制字符串,返回它们的和(用二进制表示)。
例子
addBinary('11','1') -> '100'
addBinary('1010','1011') -> '10101'
假设
- 输入为 非空 字符串且只包含数字 1 和 0
tips
- 模拟加法运算
- 注意进位
答案
解法1:
def addBinary(a,b):
if not a or not b: return a or b
a, b, ans = a[::-1], b[::-1], []
# carry: 进位
i = j = carry = 0
while i < len(a) or j < len(b) or carry:
n1 = int(a[i]) if i < len(a) else 0
n2 = int(b[j]) if j < len(b) else 0
carry, cur = divmod(n1 + n2 + carry, 2)
ans.append(str(cur))
i, j = i + 1, j + 1
return ''.join(ans[::-1])
性能:
- 时间复杂度
O(n)
- 空间复杂度
O(1)
关键点:
- 模拟加法运算
- 注意进位
算法:
- 遍历两个二进制字符串,从低位开始相加,相加结果的模就是该位的值,商就是进位
- 对每一位做运算的时候要将进位加进来,没有进位则为零
解法2:
def addBinary(bin1: str, bin2: str) -> str:
"""
1. 判断bin1、bin2的值是否为空,如果其中一个输入为空,则直接返回另一个输入;如果两个输入都为空,则返回空
2. 将二进制数字字符串转为数字,然后做加法运算
3. 将运算结果通过bin()方法转为字符串,取0b后面的部分
:param bin1:
:param bin2:
:return:
"""
# 判断bin1、bin2的值是否为空,如果其中一个输入为空,则直接返回另一个输入;如果两个输入都为空,则返回空
if not bin1 or not bin2: return bin1 or bin2
bin1 = int(bin1, 2)
bin2 = int(bin2, 2)
return bin(bin1 + bin2)[2:]
性能:
- 时间复杂度
O(n)
- 空间复杂度
O(1)
关键点:
- 利用int(),可以将数字字符串转为数字
- 利用bin()方法,将数字转为二进制字符串