67.二进制求和
描述
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
示例1
输入: a = “11”, b = “1”
输出: “100”
示例2
输入: a = “1010”, b = “1011”
输出: “10101”
我
buff = 0
s = ''
flag = 1
flag1 = 1
l = min(len(a), len(b))
if len(a) > len(b):
temp = a[len(a) - l:]
min_string = b
other = a[:len(a) - l]
elif len(a) < len(b):
temp = b[len(b) - l:]
min_string = a
other = b[:len(b) - l]
else:
flag1 = 0
temp = a
min_string = b
for i in range(l - 1, -1, -1):
if buff == 0:
if temp[i] == min_string[i] == '0':
s += '0'
buff = 0
elif temp[i] == min_string[i] == '1':
s += '0'
buff = 1
else:
s += '1'
buff = 0
else:
if temp[i] == min_string[i] == '0':
s += '1'
buff = 0
elif temp[i] == min_string[i] == '1':
s += '1'
buff = 1
else:
s += '0'
buff = 1
if not flag1:
if buff == 1:
s += '1'
elif not buff:
s += other[::-1]
else:
for j in range(len(other) - 1, -1, -1):
if other[j] == '0':
s += '1'
if j == 1:
s+=other[:1]
else:
other = other[:j]
s += other[::-1]
flag = 0
break
else:
s += '0'
if j == 0:
s += '1'
return s[::-1]
代码调了两个多小时,越写越复杂,终于通过。错误主要出现在切片反转。结果一看别人的就两行代码,扎心了!
两行代码
a, b = int('0b' + a, 2), int('0b' + b, 2)
return bin(a + b)[2:]
emmm…我该说什么呢。哈哈哈让我们看看一行代码的吧!!
return bin(int(a,2)+int(b,2))[2:]
还有另外长一点但比我短的代码,是将a,b反转过来,这样列表切片方便。
int()函数用于将一个字符串或数字转换为整型。语法:
class int(x, base)
x–字符串或数字
base–进制数,默认十进制。
bin()函数返回一个整型int或者长整数long int的二进制表示。
bin()运算返回的是二进制。所以前两位是二进制的标志,需要[2:]去除。