引言
之前已经完成了对hot100的全部题目的刷题,近期打算完成精品top面试系列的题目。剩下的题目主要都是M和H难度的,还是按照题号来刷题。
29 两数相除
类似于之前做过的两数相乘的题目,两数相除的思路很相近,都是利用位运算,倍增的计算。
首先我们依次进行倍增运算,每次翻一倍,并用count计数。当除数大于被除数时,再开始减小,每次出现被除数大于除数,都记录当前的count。
class Solution:
def divide(self, dividend: int, divisor: int) -> int:
# 首先保存符号
if (divisor<0 and dividend<0) or (dividend>0 and divisor>0):
sgn = 1
else:
sgn = -1
dividend = abs(dividend)
divisor = abs(divisor)
# 进行递增
count = 0
while divisor<=dividend:
count += 1
divisor <<= 1
# 依次递减,每次记录位数
result = 0
while count>0:
count -= 1
divisor >>= 1
if divisor <= dividend:
result += 1<<count
dividend -= divisor
if -(1<<31) <= sgn*result <= (1<<31)-1:
return sgn*result
else:
return (1<<31)-1