LeetCode第二十九題—Python實現
阿新 • • 發佈:2021-02-02
技術標籤: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) # 去掉溢位情況