Leetcode 29 兩數相除

2021-09-27 21:53:41 字數 3818 閱讀 8989

方法一:

題幹中說明不能用乘法和除法, 那麼我們可以用減法, 被除數最多可以減多少個除數還能保證是非負的即可.換句話說商為被除數減去除數的總次數

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說...