栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

leetcode第二题 python_leetcode 两数相除?

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

leetcode第二题 python_leetcode 两数相除?

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)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/783685.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号