题目
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
解答
方案一
利用语言特性,先将字符串转化为数值,再利用语言的数值运算。
def addBinary(a: str, b: str) -> str:
'''方案一:
先转化为int, 然后在执行数值操作, 最后转化回 string
'''
sum = int(f'0b{a}', 2) + int(f'0b{b}', 2)
return bin(sum)[2:]
方案二
- 将输入的两个字符串转化为字符数组(语言支持直接遍历的话可以不转);
- 倒序遍历最长的字符数组(注意先判断短的是否越界);
- 利用加法的规则,进行相加;
- 返回最终结果。
def addBinary(a: str, b: str) -> str:
max_len = len(a) if len(a) > len(b) else len(b)
carry = 0 # 进位的数值
ret = []
for i in range(max_len):
a_index = len(a) - i - 1
b_index = len(b) - i - 1
if a_index >= 0 and b_index >= 0: # 都没有越界
num = int(a[a_index]) + int(b[b_index]) + carry
if a_index < 0: # a 越界
num = int(b[b_index]) + carry
if b_index < 0: # b 越界
num = int(a[a_index]) + carry
# 加法法则
if num < 2:
ret.append(str(num))
carry = 0
else:
ret.append(str(num - 2))
carry = 1
if carry == 1: # 最后是否进位了
ret.append('1')
ret.reverse()
return ''.join(ret)
- 根据leetcode的结果表明, 方案二的性能比方案一速度快10%
原文
https://leetcode-cn.com/explore/learn/card/array-and-string/200/introduction-to-string/779/