知识点
- 有符号的整数用二进制表示时最左边第一位代表正负符号、如果操作系统是32位的则表示的整数范围是 [−2^31, 2^31−1], 在计算过程中要防止溢出。
- 整数实际上使用二进制存储的,解题时转化为二进制的位计算有时会更加方便。位运算共有6种:非、与、或、异或、左移和右移
- 考虑边界情况,比如0不可以当除法的分母
基础练习
1.整数除法
解题思路
- 首先考虑a和b都是正整数,除数是b,被除数是a,存在最小正整数k>= 0,使得b乘以2的k次方大于a。b-a乘以2的k-1次方后,得到新的余数,余数>=b,循环计算k值,直到余数<b,将所有的k值累加。
- 负数转为正数可能会溢出,所以统一将正数转为负数,使用正负数的标记变量来记录,最后返回的商是正数还是负数。
- 边界情况考虑−2^31除以-1时会导致溢出,此时应该直接返回最大整数。
python3答案
class Solution:
def divide(self, a: int, b: int) -> int:
INT_MIN, INT_MAX = -2**31, 2**31 - 1
if a == INT_MIN and b == -1:
return INT_MAX
if a == 0:
return 0
nagtive_flag = False
if a > 0:
a = -a
nagtive_flag = not nagtive_flag
if b > 0:
b = -b
nagtive_flag = not nagtive_flag
left = a
result = 0
while left <= b:
k = 0
while b * (2**k) >= left :
k += 1
left = left - b*(2**(k-1))
result += 2**(k-1)
return -result if negative_flag else result
2.二进制加法
解题思路
二进制的加法类比十进制的加法,满二进一。因为加法是右对齐的,所以需要先把两个字符串反转,计算完成后再将结果反转一次。
python3实现
class Solution:
def addBinary(self, a: str, b: str) -> str:
len_a = len(a)
len_b = len(b)
reverse_a = ""
reverse_b = ""
size_max = max(len_a, len_b)
result = ""
rev = ""
forward = 0
for i in range(len_a -1,-1, -1):
reverse_a += a[i]
for i in range(len_b -1,-1, -1):
reverse_b += b[i]
for i in range(size_max):
if i < len_a:
m = int(reverse_a[i])
else:
m = 0
if i < len_b:
n = int(reverse_b[i])
else:
n = 0
if m + n + forward >= 2:
result += str(m + n + forward - 2)
forward = 1
elif forward > 0:
result = result + str(m+n+forward)
forward = 0
else:
result = result + str(m + n)
if forward > 0:
result += '1'
forward -= 1
for i in range(len(result)-1,-1,-1):
rev = rev + str(result[i])
return rev