原题出处:https://leetcode.cn/leetbook/read/top-interview-questions-medium/xwp6vi/
解法一:
class Solution:
def divide(self, dividend: int, divisor: int) -> int:
# 特判除数为0的情况
if divisor == 0:
return 0
# 特判被除数等于-2^31,除数等于1的情况
if dividend == -2147483648 and divisor == 1:
return -2147483648
# 特判除数等于-1,被除数等于-2^31的情况
if divisor == -1 and dividend == -2147483648:
return 2147483647
# 标记结果正负号
flag = (dividend > 0 and divisor > 0) or (dividend < 0 and divisor < 0)
# 将除数与被除数取绝对值,并记录结果正负号
dividend, divisor = abs(dividend), abs(divisor)
# 特判被除数小于除数的情况
if dividend < divisor:
return 0
# 将除数与被除数取相反数
if dividend > 0:
dividend = -dividend
if divisor > 0:
divisor = -divisor
# 不断将除数左移,直到它大于被除数为止
multiple = 1
while dividend <= (divisor << 1):
divisor <<= 1
multiple <<= 1
# 计算结果
res = 0
while multiple > 0:
if dividend <= divisor:
dividend -= divisor
res += multiple
multiple >>= 1
divisor >>= 1
# 处理结果正负号
if not flag:
res = -res
return res
思路:
二分查找的思路,每次将除数左移一位,直到它大于被除数为止。这时,可以将左移的位数(即除数的倍数)记录下来,并将被除数减去左移后的值。然后重复这个过程,直到被除数小于除数。最后把记录的所有除数倍数相加即可。
需要注意的一些细节,需要处理被除数小于0的情况,这时可以将其取反并标记一下,需要处理除数为0的情况,需要特别注意边界值的情况。