原题:https://leetcode.cn/problems/add-binary/description/
给你两个二进制字符串 a
和 b
,以二进制字符串的形式返回它们的和。
示例 1:
输入:a = "11", b = "1" 输出:"100"
示例 2:
输入:a = "1010", b = "1011" 输出:"10101"
提示:
1 <= a.length, b.length <= 104
a
和b
仅由字符'0'
或'1'
组成- 字符串如果不是
"0"
,就不含前导零
思路
①用0补齐a,b中长度较短的一方,使得a,b长度相同。
②构造一个a的长度+1的全0字符串,按位填充求和结果
③同时反向遍历a,b的每一位,将按位异或结果填充进全0字符串,同时进位也要与前一位异或运算
④把结果中无用前缀0去掉,输出结果
class Solution:
def addBinary(self, a: str, b: str) -> str:
if len(a)<len(b):
a,b=b,a#确保a长度大于等于b
while len(a)!=len(b):
b='0'+b#补前缀0
co=0#初始化进位
total=list('0'*(len(a)+1))#初始化结果字符串
for i in range(len(a)-1,-1,-1):#反向遍历a,b
if a[i]==b[i]=='1':#先判断进位
co=1
else:
co=0
if co==1:
total[i+1]=str(int(a[i])^int(b[i])^int(total[i+1]))
total[i]=str(int(total[i])^co)
co=0#重置进位为0
else:
if int(a[i])^int(b[i])==1 and total[i+1]=='1':
total[i]=str(int(total[i])^1)#特殊处理首位进一
total[i+1]=str(int(a[i])^int(b[i])^int(total[i+1]))
s=''.join(total)
index=s.find('1')#前缀0去掉
return s[index:]