1 题目描述
2 解题思路
2.1 整数相加过渡
将A,B转化为整数(使用迭代实现),然后将A+B转换成二进制的字符串
返回的内容从第二个下标开始,是为了剔除bin()函数返回的'0b'这两个字符串
class Solution:
def addBinary(self, a: str, b: str) -> str:
A=0
for i in a:
A=A*2+int(i)
B=0
for i in b:
B=B*2+int(i)
#分别计算A和B对应的整数
return(bin(A+B)[2:])
2.2 整数相加过渡(使用int函数)
int(str,n):以n为基,计算字符串str的值
class Solution:
def addBinary(self, a: str, b: str) -> str:
A=int(a,2)
B=int(b,2)
return(bin(A+B)[2:])
2.3 字符串倒置,一位一位加(同时考虑进位的问题)
class Solution:
def addBinary(self, a: str, b: str) -> str:
a_=a[::-1]
b_=b[::-1]
carry=0 #进位
lstr='' #返回的字符串
for i in range(min(len(a),len(b))):
tmp=int(a_[i])+int(b_[i])+carry
if(tmp>1):
carry=1
tmp=tmp-2
else:
carry=0
#看是否有进位
lstr+=str(tmp)
if(len(a)>min(len(a),len(b))):
for i in range(min(len(a),len(b)),len(a)):
tmp=int(a_[i])+carry
if(tmp>1):
carry=1
tmp=tmp-2
else:
carry=0
lstr+=str(tmp)
#有可能一位计算完了,另一位还有值
if(len(b)>min(len(a),len(b))):
for i in range(min(len(a),len(b)),len(b)):
tmp=int(b_[i])+carry
if(tmp>1):
carry=1
tmp=tmp-2
else:
carry=0
lstr+=str(tmp)
if(carry==1):
lstr+=str(1)
#全部计算完了,如果还有进位,在前面补一位
return(lstr[::-1])
2.4 2.3方法修改版
class Solution:
def addBinary(self, a: str, b: str) -> str:
a=list(a)
b=list(b)
carry=0 #进位
lstr='' #最终要返回的字符串
while(True):
tmp=0
flag=True
#flag表示能不能跳出这个循环,如果a,b没有值,进位为0,就能跳出
if(len(a)>0):
print('a',a)
tmp+=int(a.pop())
flag=False
if(len(b)>0):
print('b',b)
tmp+=int(b.pop())
flag=False
if(carry>0):
print('c',carry)
tmp+=carry
flag=False
if(tmp>1):
carry=1
tmp-=2
else:
carry=0
if(flag==True):
break
lstr+=str(tmp)
return(lstr[::-1])
2.5 位运算
先看一下位操作的一些结论
1)异或操作(位数不同的话向前补零)
——>结果是对应两位之间不考虑进位的加法结果
2)与操作(位数不同的话向前补零)
——>只有x,y对应的元素都是1才会得到该位置为1
——>结果是x,y对应位置相加,会不会产生进位的情况
然后每一位的进位情况,影响的是前一位是否加一,所以与操作的结果要向左移动一位
然后上一次不考虑进位的相加结果+后一位的进位情况,再得到一对不考虑进位结果的+进位结果
依次迭代,直到进位情况全部为0,此时没有进位了为止
class Solution:
def addBinary(self, a: str, b: str) -> str:
A=int(a,2)
B=int(b,2)
while(B):
A,B=A^B,(A&B)<<1
#此时的A,B分别表示两个数(数和进位)相加的结果(不考虑进位)、进位的结果
return bin(A)[2:]
注:在python里面 a,b=c,d 的意思是(a,b)=(c,d),也就是cd同时调整