實作一個函數 divide(dividend, divisor)
,計算兩個整數 dividend
和 divisor
的商,並返回其結果。
注意:不允許使用乘法、除法和取模運算子。
條件限制:
輸入:
dividend = 10, divisor = 3
輸出:
3
解釋:10 除以 3,商為 3。
輸入:
dividend = 7, divisor = -3
輸出:
-2
解釋:7 除以 -3,商為 -2。
輸入:
dividend = -2147483648, divisor = -1
輸出:
2147483647
解釋:結果超出 32 位整數範圍,返回 2^31 - 1。
要解決這道題,我們需要考慮以下幾個方面:
思路
我們可以用多次減法來模擬除法運算:
詳細步驟
程式碼實現
class Solution:
def divide(self, dividend: int, divisor: int) -> int:
if dividend == -2**31 and divisor == -1:
return 2**31 - 1 # 處理溢出情況
# 確定結果的正負
negative = (dividend < 0) ^ (divisor < 0)
# 取絕對值進行計算
dividend, divisor = abs(dividend), abs(divisor)
result = 0
while dividend >= divisor:
dividend -= divisor
result += 1
# 恢復符號
result = -result if negative else result
return max(-2**31, min(result, 2**31 - 1))
時間與空間複雜度
思路
用單次減法效率較低,尤其是被除數很大時。我們可以採用指數倍增的方式來加速:
詳細步驟
程式碼實現
class Solution:
def divide(self, dividend: int, divisor: int) -> int:
if dividend == -2**31 and divisor == -1:
return 2**31 - 1 # 處理溢出情況
# 確定結果的正負
negative = (dividend < 0) ^ (divisor < 0)
# 取絕對值進行計算
dividend, divisor = abs(dividend), abs(divisor)
result = 0
while dividend >= divisor:
temp_divisor, multiple = divisor, 1
while dividend >= (temp_divisor << 1):
temp_divisor <<= 1
multiple <<= 1
dividend -= temp_divisor
result += multiple
# 恢復符號
result = -result if negative else result
return max(-2**31, min(result, 2**31 - 1))
時間與空間複雜度
思路
位運算的基本思路是利用位移操作來高效計算倍增。通過計算 divisor
向左移動幾位可以逼近 dividend
,從而快速確定商的大小。
詳細步驟
程式碼實現
class Solution:
def divide(self, dividend: int, divisor: int) -> int:
if dividend == -2**31 and divisor == -1:
return 2**31 - 1 # 處理溢出情況
# 確定結果的正負
negative = (dividend < 0) ^ (divisor < 0)
# 取絕對值
dividend, divisor = abs(dividend), abs(divisor)
result = 0
for i in range(31, -1, -1):
if (dividend >> i) >= divisor:
result += 1 << i
dividend -= divisor << i
# 恢復符號
result = -result if negative else result
return max(-2**31, min(result, 2**31 - 1))
時間與空間複雜度
倍增法與位移法是實際開發中常用的高效解法。如果你有任何疑問,歡迎留言討論!