第一种思路: 设置两个游标,从右到左像十进制加法一样,两位相加,遇2进位。进位上唯一补最高位。
python代码:
class Solution:
def addBinary(self, a, b) -> str:
res = ""
i1 , i2 ,carry = len(a)-1 , len(b)-1 , 0
while i1 >= 0 or i2 >= 0: #从右往左取
x = ord(a[i1]) - ord('0') if i1 >= 0 else 0 #将每一位转成数值
y = ord(b[i2]) - ord('0') if i2 >= 0 else 0
sum1 = x + y + carry #计算结果
res += str(sum1 %2)
carry = sum1 //2 #计算进位
#处理循环
i1 , i2 = i1-1 , i2 - 1
if carry != 0 : res+=str(carry) #处理最左边一位
return res [:: -1] #逆序返回
【python语法】
ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常。
官方给出一种位运算操作,挺秀的。
【算法思想】
- 把 a和 b 转换成整型数字 x 和 y,在接下来的过程中,x 保存结果,yy 保存进位。
- 当进位不为 0 时
- 计算当前 x 和 y 的无进位相加结果:answer = x ^ y
- 计算当前 x 和 y 的进位:carry = (x & y) << 1
- 完成本次循环,更新 x = answer,y = carry
- 返回 xx 的二进制形式
class Solution:
def addBinary(self, a, b) -> str:
x, y = int(a, 2), int(b, 2)
while y:
answer = x ^ y
carry = (x & y) << 1
x, y = answer, carry
return bin(x)[2:]
第一轮计算中,answer
的最后一位是 x 和 y 相加之后的结果
carry
的倒数第二位是 x 和 y 最后一位相加的进位。
carry 是由 x 和 y 按位与并且左移得到的,那么最后会补零,
所以后面计算的过程中已经确定的低位的数位不受影响,
而每一轮都可以得到一个第 i 位的答案和它向第 i + 1 位的进位,也就模拟了加法的过程。
过程演示:【手动debug】
【技巧】 二进制 异或运算 --->无进位 相加。目的,确定低位结果。
二进制 与运算后 左移,直接判断需要进位的数位。
i = 0 | x = 101 , y = 11 | x ^ y = 110 ; x& y << = 010 | 确定第1位 |
i = 1 | x = 110 , y = 010 | x ^ y = 100 ; x& y << = 100 | 确定第1-2位 |
i = 2 | x = 100 , y = 100 | x ^ y = 000 ; x&y<< =1000 | 确定第1-3位 |
i = 3 | x = 000 , y = 1000 | x ^ y = 1000 ; x&y<< =0000 | 确定第1-4位 |
y = 0 结束循环 |
码字不易,你的赞是我创做的动力。
后一种题解: