LeetCode29 兩數相除 python3
阿新 • • 發佈:2018-11-21
給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算子。
返回被除數 dividend 除以除數 divisor 得到的商。
示例 1:
輸入: dividend = 10, divisor = 3 輸出: 3 示例 2:
輸入: dividend = 7, divisor = -3 輸出: -2 說明:
被除數和除數均為 32 位有符號整數。 除數不為 0。 假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 [−231, 231 −
1]。本題中,如果除法結果溢位,則返回 231 − 1。
這道題考察的位運算的除法。首先我們會想到用加法或者減法來代替除法,程式碼如下:
class Solution: def divide(self, dividend, divisor): """ :type dividend: int :type divisor: int :rtype: int """ divide_num = 0 if dividend > 0 and divisor > 0 or dividend <= 0 and divisor <= 0: while dividend >= divisor: dividend -= divisor divide_num += 1 return divide_num else: if dividend < 0: dividend = -dividend elif divisor < 0: divisor = -divisor while dividend >= divisor: dividend -= divisor divide_num += 1 return -divide_num if __name__ == "__main__": s = Solution() dividend = 1 divisor = 1 print(s.divide(dividend,divisor))
顯然這樣的程式碼會超時
於是我們自然而然會想到用一種更簡潔的除法來代替
於是想到用位運算除法
不懂可以參考:https://www.jianshu.com/p/7bba031b11e7
程式碼如下:
class Solution: def divide(self, dividend, divisor): """ :type dividend: int :type divisor: int :rtype: int """ result = 0 temp = 0 if divisor >= 0 and dividend >= 0 or divisor < 0 and dividend < 0: sign = 1 else: sign = -1 if dividend == 0 or divisor == 0: return 0 dividend = abs(dividend) divisor = abs(divisor) for i in range(32, -1, -1): if temp + (divisor << i) <= dividend: temp += divisor << i result |= 1 << i if sign < 0: result = -result elif sign > 0: result = result if result < -2**31 or result > (2**31) -1: return 2**31 -1 else: return result if __name__ == "__main__": s = Solution() dividend = 2**31 -1 divisor = 1 print(s.divide(dividend,divisor))