解题思路一:暴力遍历(88ms)
将a转换为a、b中最长的字符串,将a、b转换为数字列表a1、b1不用来回转换元素类型方便计算。设置i为b1的索引号(从后往前),设置j为a1的索引号(在遍历的时候使用-j以从后往前遍历)。从后往前遍历b1(短的字符串对应的列表),将a1相对应的位置赋值为a1、b1列表中对应元素的和。判断a1列表中的数值是否存在数值2,若存在2则对应位置赋值为0,前一位置加1,为了防止溢出,当第一位为2时在首位添加1。计算完成后遍历列表将列表转换为字符串。
def addBinary(a, b):
if len(a) < len(b):
c = a
a = b
b = c#把a设置为最长的字符串
a1 = []
b1 = []
res = ''
#将a,b转换为数字列表
for aa in a:
a1.append(int(aa))
for bb in b:
b1.append(int(bb))
#定义i为b1的索引(从后往前遍历),j为a1的索引(使用-j从后往前遍历)
i = len(b1) - 1
j = 1
while i > -1:#遍历b1
print(i)
a1[-j] = a1[-j] + b1[i]#计算列表a1中对应的数值
for n in range(len(a1) -1, -1, -1):#遍历更新后的a1列表,实现2的进位
if a1[n] == 2:#若a1中存在2,则把0赋值给相应位置,并且前一位加1
a1[n] = 0
if n == 0:#为了防止列表索引(n -1)溢出,若第一位为2,则在第0位插入1
a1.insert(0, 1)
else:
a1[n - 1] += 1
i = i - 1
j = j + 1
for aa in a1:#将结果列表转换为字符串
res += str(aa)
return res
解题思路二:(48ms)
使用中间变量p表示是否进位,使用s表示相加的数值。定义一个结果字符串r,p初始值为0。将字符串a、b填充为相同长度的字符串。从后往前遍历字符串,将两个字符串对应位置上的数字相加,并且加上上一结果的进位结果p,更新结果字符串r(将s%2,若s=2则字符串前面加0,否则加1),更新进位结果p(s//2,若s=2则p=1,表示需要进位,即下一位加1)。若最后p=0则说明第一位为1不需要进位,直接返回r,若p=1,则说明第一位为2,需要在字符串r前面加1。
注:结果字符串r从后往前更新,需要 str(s % 2) + r
def addBinary(a, b):
len(b) - len(a)
a = d * '0' + a
b = -d * '0' + b
for i, j in zip(a[::-1], b[::-1]):
s = int(i) + int(j) + p
r = str(s % 2) + r
p = s // 2
return '1' + r if p else r
思路三:
使用python内置函数bin()(40ms)
bin() 返回一个整数 int 或者长整数 long int 的二进制表示。其中int(a,2)中的2表示2进制(将a转换为2进制整数)bin()[2:]为二进制表示bin()直接输出为0b01011,从第2索引后面的才是二进制表示。
def addBinary(a, b):
return bin(int(a, 2) + int(b, 2))[2:]