力扣练习之两数相除

我爱海鲸 2023-05-26 00:03:25 暂无标签

简介中级算法、数学

原题出处: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的情况,需要特别注意边界值的情况。

你好:我的2025