比较简单的一道题,但是感觉代码有些冗余,不过现阶段只能写出这样的代码了,需要注意的是考虑进位的问题,应当把进位放到循环里面:主要的思路是:把字符串变成单个数字放到list中,然后reverse,把两个list补全成等长的,然后从第一个数字相加,添加到另外的一个list,考虑进位,最后再reverse,然后变成int,去掉多余的0,再变成str类型。
67.问题表述
Given two binary strings, return their sum (also a binary string).
For example,
a = "11"
b = "1"
Return "100".
Subscribe to see which companies asked this question.
#code
class Solution:
def __init__(self):
self.list_a = []
self.list_b = []
self.list_c = []
def list_array(self, x):
list_x = []
for i in range(len(x)):
list_x.append(int(x[i]))
list_x.reverse()
return list_x
def makeup(self, m, n):
while abs(len(m) - len(n)) > 0:
if len(m) - len(n) > 0:
n.append(0)
else:
m.append(0)
def arraylistAdd(self, m, n):
c = []
length = len(m)
carrybit=0
for i in range(0, length):
c.append((m[i] + n[i] + carrybit) % 2)
carrybit = int((carrybit + m[i] + n[i]) / 2)
c.append(carrybit)
c.reverse()
return c
def list2str(self, list_x):
string = ''
for i in range(len(list_x)):
string += str(list_x[i])
return str(int(string))
def addBinary(self, a, b):
"""
:type a: str
:type b: str
:rtype: str
"""
self.list_a = self.list_array(a)
self.list_b = self.list_array(b)
self.makeup(self.list_a, self.list_b)
self.list_c = self.arraylistAdd(self.list_a, self.list_b)
str_c = self.list2str(self.list_c)
return str_c
编写完成之后,看了看其他人写的代码,实在是简洁,看起来也很舒服
class Solutionbit(object):
def addBinary(self, a, b):
if len(a) == 0 or len(b) == 0:
return a + b
a_2 = int(a, 2)
b_2 = int(b, 2)
carrybit = 1
while carrybit != 0:
carrybit = (a_2 & b_2) << 1
a_2 = a_2 ^ b_2
b_2 = carrybit
return bin(a_2)[2:]
#其中int(a,2),把字符串a看做是二进制,然后用10进制表示出来
#计算carrybit的方法很独特,使用与的方式然后左移一位
#再通过异或的方法计算数字位,把进位复制给b_2,循环
#bin(a_2)[2:]把字符串a_2表示成二进制取字符串