1. 读懂题目
2. 分析,推导解法,产生思路。
解题思路:(1)模拟二进制转换。借鉴「列竖式」的方法,末尾对齐,逐位相加。逢二进一。
(2)位运算,可不使用加减乘除。(位运算的方式参考于官方题解)
3. 代码实现
class Solution(object):
def addBinary(self, a, b):
"""
:type a: str
:type b: str
:rtype: str
"""
# 模拟:重点考虑进位
# 借鉴「列竖式」的方法,末尾对齐,逐位相加。逢二进一
while len(a) > len(b) : b = '0' + b # 对齐字符串a,b
while len(a) < len(b) : a = '0' + a
i = len(a) - 1
carry = 0 # 标志进位
res = ''
while i >= 0 :
sum = int(a[i]) + int(b[i]) + carry
carry = int(sum / 2) # 当sum为3/2时,进位为1;为1/0时进位为0
res += str(sum % 2)
i = i - 1
if carry : res += str(carry)
return res[::-1]
def addBinary1(self, a, b):
# 位运算,不使用加减乘除
"""
1. 把a和b转换成整型数字x,y,在接下来的过程中,x保存结果,y保存进位。
2. 当进位不为0时:
计算当前x与y的无进位相加结果:answer = x + y
计算当前x和y的进位:carry = (x & y) << 1
完成本次循环,更新x = answer, y = carry
3. 返回x的二进制形式
"""
x = int(a,2) # x保存结果
y = int(b,2) # y 保存进位
while y != 0:
print(x,y,sep=' ')
answer = x ^ y
carry = (x & y) << 1
x = answer
y = carry
return bin(x)[2:]
补充:位运算面试时用的不多,以后有时间可以刷一下位运算的相关题。