难度 | 题目 |
---|---|
简单 | 剑指 Offer II 001. 整数除法 |
简单 | 剑指 Offer II 002. 二进制加法 |
正数最大是231-1,因为32为符号位,即0x7fffffff。负数最小为-231,因为0x11111111补码为10000001。
class Solution:
def divide(self, a: int, b: int) -> int:
if b==1: return a
if a==-2**31 and b==-1: # 除法结果溢出了
return (2**31) - 1
beichu, chu, res = abs(a), abs(b), 0
# 从2**31 试到2**0再到1
for i in range(31, -1, -1):
# 2**i * b <= a
while (chu<<i) <= beichu:
res += (1<<i) # 即2**ii
beichu -= (chu<<i)
# 同号返回res, 异号返回-res即可
return res if ((a>0) == (b>0)) else -res
class Solution:
def addBinary(self, a: str, b: str) -> str:
# 法1:模拟逢二进一
# 反转一下方便从低位遍历到高位
a = a[::-1]
b = b[::-1]
res = [] # 存放结果
len_a, len_b = len(a), len(b)
max_len = max(len_a, len_b)
carry = 0
for i in range(0, max_len):
# 若该位没有数字了,那就0,方便和b进行相加
carry += (int(a[i]) if i<len_a else 0)
carry += (int(b[i]) if i<len_b else 0)
res.append(str(carry%2))
carry //= 2
if carry==1: res.append('1')
return ''.join(res[::-1])
法2:位运算,计算每次的无进位相加结果,再和进位相加,直到无进位即可。
class Solution:
def addBinary(self, a: str, b: str) -> str:
x = int(a, 2)
y = int(b, 2)
while y:
# 无进位相加
ans = x^y
# 把每一位的进位算出来并移到其前一位
carry = (x&y) << 1
# 若有进位,则下一轮让无进位结果和进位相加
x, y = ans, carry
# 因为bin返回的是字符串类型的二进制数:如'0b0001',所以去掉0b即可
return bin(x)[2:]