leetcode第29题python版两数相除

class Solution:
    """
    29. 两数相除
    给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
    """
    def divide(self, dividend: int, divisor: int) -> int:
        # 思路:除数向左移位运算不断找比被除数小的最大数,设置辅助变量track记录每次移位除数变大的倍数
        # 参考视频:https://www.bilibili.com/video/BV1SQ4y1K7z5?spm_id_from=333.337.search-card.all.click
        # 1. 初始化及特殊处理
        # 记录最大的边界值,32位有符号数的范围[-2^31, 2^31 - 1]
        limit = 2 ** 31  
        if divisor == 0:
            raise Exception("两数相除,除数不能为0")
        if dividend == 0 and divisor != 0:
            return 0
        # 记录结果符号,True代表正数,False代表负数
        # isNeg = (dividend > 0 and divisor < 0) or (dividend < 0 and divisor > 0)
        isNeg = (divisor < 0) != (dividend < 0)  # 优化判断结果为负的方法
        dividend, divisor = abs(dividend), abs(divisor)
        res = 0
        div, track = divisor, 1

        # 2. while循环处理
        while dividend >= divisor:
            while dividend >= (div << 1):
                # 易错点
                # div << 1
                # track << 1
                div <<= 1
                track <<= 1
            res += track  # 记录当前拆解的最大块的结果值
            # 记录剩余的dividend
            dividend -= div
            # 恢复div, track
            div, track = divisor, 1

        # 3. 返回值, 负数不存在溢出的情况,只需要考虑正数溢出的情况
        # 易错点
        # return min(limit, -res if isNeg else res)
        return min(limit-1, -res if isNeg else res)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ICPunk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值