29.leetcode题目讲解(Python):两数相除

2018-10-27  本文已影响76人  夏山闻汐

题目:


题目

这道题直接使用减法会来实现会超过时间限制,特别是 2^{31} - 1 / 1 这种情况。实现的思路是采用我们小学学过的除法计算方式:

除法示意

通过移位操作,我们可以使用二进制除法来解这套题, 参考代码如下(思路来源zemer):

class Solution:
    def divide(self, dividend, divisor):
        """
        :type dividend: int
        :type divisor: int
        :rtype:

        """
        res = 0
        if dividend == 0:
            return res

        # 初始化
        i = 0
        res = 0
        p = abs(dividend)
        q = abs(divisor)

        # 移位对齐被除数的最左端
        while q << i <= p:
            i = i + 1

        # 利用二进制进行除法运算
        for j in reversed(range(i)):
            if q << j <= p:
                p = p - (q << j)
                res = res + (1 << j)

        # 内存限制
        if (dividend > 0) != (divisor > 0) or res < -1 << 31:
            res = -res

        return min(res, (1 << 31) - 1)

其它题目:leetcode题目答案讲解汇总(Python版 持续更新)

ps:如果您有好的建议,欢迎交流 :-D,
也欢迎访问我的个人博客 苔原带 (www.tundrazone.com)

上一篇下一篇

猜你喜欢

热点阅读