方法一:
題幹中說明不能用乘法和除法, 那麼我們可以用減法, 被除數最多可以減多少個除數還能保證是非負的即可.換句話說商為被除數減去除數的總次數
class
solution
:def
divide
(self, dividend, divisor)
: sig =
true
if dividend*divisor >
0else
false
# 判斷二者相除是正or負
dividend, divisor=
abs(dividend)
,abs
(divisor)
# 將被除數和除數都變成正數
count =
0# 用來表示減去了多少個除數,也就是商為多少
while divisor <= dividend:
# 當被除數小於除數的時候終止迴圈
dividend -= divisor
count +=
1 res = count if sig ==
true
else
-count # 給結果加上符號
return
max(
min(res,2**
31-1)
,-2**
31)
方法二:
針對於第一種的缺陷, 我們應該想到讓除數成倍的增長, 這樣被除數進行的減法操作就會少很多.
class
solution
:def
divide
(self, dividend, divisor)
: sig =
true
if dividend*divisor >
0else
false
# 判斷二者相除是正or負
dividend, divisor=
abs(dividend)
,abs
(divisor)
# 將被除數和除數都變成正數
res =
0# 用來表示減去了多少個除數,也就是商為多少
while divisor <= dividend:
# 當被除數小於除數的時候終止迴圈
tmp_divisor, count = divisor,
1# 倍增除數初始化
while tmp_divisor <= dividend:
# 當倍增後的除數大於被除數重新,變成最開始的除數
dividend -= tmp_divisor
res += count
count +=
1# 更新除數擴大的倍數
tmp_divisor = divisor*count # 更新除數
res_value = res if sig ==
true
else
-res # 給結果加上符號
return
max(
min(res_value,2**
31-1)
,-2**
31)
方法三:該方法是對方法二的優化, 因為方法二中還是用到了乘法,所以我們可以用移位運算來代替乘法運算, 每次移動一位相當於擴大了兩倍, 這個時候大家應該能感覺出來方法三比方法二的計算速度可能會更快一些(因為方法二是除數擴大倍數是1倍1倍的增加, 而方法三中除數擴大的倍數是兩倍兩倍的增加).
class
solution
:def
divide
(self, dividend, divisor)
: sig =
true
if dividend*divisor >
0else
false
# 判斷二者相除是正or負
dividend, divisor=
abs(dividend)
,abs
(divisor)
# 將被除數和除數都變成正數
res =
0# 用來表示減去了多少個除數(減去除數的次數),也就是商為多少
while divisor <= dividend:
# 當被除數小於除數的時候終止迴圈
tmp_divisor, count = divisor,
1# 倍增除數初始化
while tmp_divisor <= dividend:
# 當倍增後的除數大於被除數重新,變成最開始的除數
dividend -= tmp_divisor
res += count
count <<=1
# 向左移動一位
tmp_divisor <<=1
# 更新除數(將除數擴大兩倍)
res_value = res if sig ==
true
else
-res # 給結果加上符號
return
max(
min(res_value,2**
31-1)
,-2**
31)
方法四:python的作弊法,用//
class
solution
:def
divide
(self, dividend, divisor)
: sig =
false
if dividend * divisor <
0else
true
# 判斷二者相除是正or負
dividend, divisor =
abs(dividend)
,abs
(divisor)
tmp = dividend // divisor
res_value = tmp if sig ==
true
else
-tmp
return
min(
max(res_value,-2
**31),
2**31-
1)
方法五:python 5行**
參考鏈結
LeetCode29 兩數相除
給定兩個整數,被除數dividend和除數divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數dividend除以除數divisor得到的商。示例 1 輸入 dividend 10,divisor 3輸出 3示例 2 輸入 dividend 7,divisor 3輸出 2說...
LeetCode 29 兩數相除
給定兩個整數,被除數dividend和除數divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數dividend除以除數divisor得到的商。示例 1 輸入 dividend 10,divisor 3 輸出 3 示例 2 輸入 dividend 7,divisor 3 輸出...
leetcode 29 兩數相除
給定兩個整數,被除數dividend和除數divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數dividend除以除數divisor得到的商。示例 1 輸入 dividend 10,divisor 3輸出 3示例 2 輸入 dividend 7,divisor 3輸出 2說...