67. 二进制求和
题目-简单难度
给你两个二进制字符串 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” ,就不含前导零
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/add-binary
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1. 位运算
class Solution:
def addBinary(self, a: str, b: str) -> str:
# 使用 `int` 函数将二进制字符串转换为十进制整数
x, y = int(a, 2), int(b, 2)
# 使用位运算计算两个整数的和, 当进位为 0 时,停止循环
while y:
# 计算无进位和(异或)
sum_without_carry = x ^ y
# 计算进位(与运算后左移一位)
carry = (x & y) << 1
# 更新 x 为新的和,y 为新的进位
x, y = sum_without_carry, carry
# 1. 用bin将结果转换为二进制字符串并返回
# return bin(x)[2:]
# 2. 手动将整数 x 转换为二进制字符串
result = ""
while x > 0:
# 获取最低位并拼接到结果前面
result = str(x % 2) + result
x //= 2
# 如果结果为空,说明是 "0"
return result if result else "0"
2. 列表
class Solution:
def addBinary(self, a: str, b: str) -> str:
# 转化为整数列表
li1 = [int(i) for i in a]
li2 = [int(i) for i in b]
# 用0补齐短的列表
while len(li1) < len(li2):
li1 = [0] + li1
while len(li1) > len(li2):
li2 = [0] + li2
# 初始化结果列表
res = []
# 初始化进位数
addOne = 0
# 从后往前遍历
for i in range(len(li1)-1,-1,-1):
# 计算当前位置的和为1还是2还是3
c = li1[i] + li2[i] + addOne
# 计算完后初始化进位值
addOne = 0
# 检查c的值是否比1大
if c > 1:
# 比1大代表要进位
addOne = 1
# 如果整体值为2,当前位置为0,为3则为1
# if c == 2:
# c = 0
# else:
# c = 1
# 可以直接用余数代替
c = c % 2
# 在列表前添加
res = [c] + res
# 最后判断是否还需要进位
if addOne == 1:
# 如果有剩余,则最后添加一个1在列表前
res = [1] + res
# 将列表转换为字符串并返回
return ''.join(map(str, res))
3. bin
class Solution:
def addBinary(self, a: str, b: str) -> str:
return bin(int(a,2)+int(b,2))[2:]
4. 2进制转10再转2
class Solution:
def addBinary(self, a: str, b: str) -> str:
# 初始化两个二进制转化为十进制后的值
sa,sb = 0,0
# 获取值
for i in range(len(a)-1,-1,-1):
sa += int(a[i])*(2**(len(a)-1-i))
for i in range(len(b)-1,-1,-1):
sb += int(b[i])*(2**(len(b)-1-i))
# 将结果相加
sc = sa + sb
# 额外判断和是否为0
if sc == 0:
return "0"
# 初始化结果列表
res = []
# 转化为二进制
while sc > 0:
# 记录当前位的二进制数(余数)
res.append(str(sc % 2))
sc //= 2 # 整除 2,向下一位进发
# 最后需要将结果倒序排列
return ''.join(res[::-1])