给定两个二进制字符串,返回他们的和(用二进制表示)。输入为非空字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
我实现的是一种直观但较为笨拙的方法,仅供理解~
题目要求两个字符串表示的二进制数相加后的结果,结果同样使用二进制表示。因为两个字符串不一定等长,而且我们需要从后往前依次计算相加结果。
-
首先将其用0补齐到最长的字符串长度,然后两个表示的二进制数数组反转
-
依次取两个数组对应位置的元素相加,使用
carry
记录可能的进位值,并使用index
记录是否到头- 如果相加结果大于2且
index
不等于零,则将结果的当前位置设为0,并更新进位 - 如果相加结果大于2且
index
等于零,除了将结果的当前位置设为0外,还需要在结果的头部插入进位1 - 如果相加结果小于2,则将相加结果作为结果相应位置的值,继续往前计算
- 如果相加结果大于2且
AC code
class Solution:
def addBinary(self, a: str, b: str) -> str:
if a == '' and b == '':
return ''
if a == '': return b
if b == '': return a
a, b = list(a), list(b)
diff = abs(len(a) - len(b))
if len(a) > len(b):
b = ['0'] * diff + b
else:
a = ['0'] * diff + a
a.reverse()
b.reverse()
carry = 0
res = []
index = len(a)
for i, j in zip(a, b):
number = int(i) + int(j) + carry
index -= 1
if number > 1 and index != 0:
carry = number // 2
res.insert(0, '{}'.format(number % 2))
elif number > 1 and index == 0:
res.insert(0, '{}'.format(number % 2))
res.insert(0, '1')
else:
res.insert(0, '{}'.format(number))
carry = 0
return ''.join(res)