1. 程式人生 > 其它 >LeetCode第二十九題—Python實現

LeetCode第二十九題—Python實現

技術標籤:LeetCodeleetcode演算法python


title: LeetCode No.29

categories:

  • OJ
  • LeetCode

tags:

  • Programing
  • LeetCode
  • OJ

LeetCode第二十九題

題目描述

給定兩個整數,被除數dividend和除數divisor。將兩數相除,要求不使用乘法、除法和 mod 運算子。

返回被除數dividend除以除數divisor得到的商。

整數除法的結果應當截去(truncate)其小數部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

示例1:

輸入: dividend = 10, divisor = 3
輸出: 3
解釋: 10/3 = truncate(3.33333..) = truncate(3) = 3
示例2:

輸入: dividend = 7, divisor = -3
輸出: -2
解釋: 7/-3 = truncate(-2.33333..) = -2


提示:

被除數和除數均為 32 位有符號整數。
除數不為0。
假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 [−231, 231− 1]。本題中,如果除法結果溢位,則返回 231− 1。

程式碼

class Solution(object):
    def divide(self, dividend, divisor):
        """
        :type dividend: int
        :type divisor: int
        :rtype: int
        """
        i, a, b = 0, abs(dividend), abs(divisor)
        # 被除數小於除數的情況直接返回0
        if a == 0 or a < b:
            return 0

        while b <= a:
            b = b << 1  # 位運算 位左移1位
            i = i + 1  # i為2冪
        else:
            res = (1 << (i - 1)) + self.divide(a - (b >> 1), abs(divisor)) # 用減法來得到商
            if (dividend ^ divisor) < 0: # 負結果判斷
                res = -res
            return min(res, (1 << 31) - 1) # 去掉溢位情況