LeetCode 兩數相除

2021-09-10 06:44:30 字數 2721 閱讀 1869

給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算子。

返回被除數 dividend 除以除數 divisor 得到的商。

示例 1:

輸入: dividend = 10, divisor = 3

輸出: 3

示例 2:

輸入: dividend = 7, divisor = -3

輸出: -2

說明:

被除數和除數均為 32 位有符號整數。

除數不為 0。

假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 [−2^31, 2^31 − 1]。本題中,如果除法結果溢位,則返回 2^31 − 1。

方法一:最直接的演算法當然是直接相減,模擬運算除法,然而當資料量大的時候,非常耗時。。。

class

solution

if(divisor ==1)

if(divisor ==-1

) bool resultflag =

false

;//結果是否為負數的flagif(

!((dividend >=

0&& divisor >=0)

||(dividend <

0&& divisor <0)

))if(dividend <0)

if(divisor <0)

long

long result =0;

//結果

上述方法感覺就是變相的暴搜。。。

方法二:下面將採用「以空間換時間」的策略,對上述演算法進行優化。即使用乙個陣列,計算好一定數量的除數的n倍,這樣可以減少相減的次數。

int

divide

(long

long dividend,

long

long divisor)

if(divisor ==1)

if(divisor ==-1

) bool resultflag =

false

;//結果是否為負數的flagif(

!((dividend >=

0&& divisor >=0)

||(dividend <

0&& divisor <0)

))if(dividend <0)

if(divisor <0)

//tempnvalue[i]代表i倍的divisor(零除外)

long

long tempnvalue[

100]=;

int maxindex =1;

//可以計算的最大的n倍divisor的值

while

(maxindex <99)

long

long result =0;

//結果

雖然時間複雜度減少了很多,但是擊敗的使用者很少,肯定與主流做法有很大的差距。。。

經翻閱前輩的演算法,發現一種移位解法。

這道題的基本思路使用移位和加減法替代乘除,因為任何int除法運算可以表示為 x = y * n, n =2^

0+2^

1+2^

2+2^

3+..

....。

這道題的難點在於 假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 [−2^31

,2^31 − 1

]。本題中,如果除法結果溢位,

則返回 2

^31 − 1。 這會造成兩個麻煩:

移位有限制,無法使用long等型別

針對int_min,無法直接轉換為正數

對策:提前判斷是否移位越界

先提前dividend +=

abs(divisor),然後結果加1,然後在轉為正數計算即可 附**

class

solution

dividend =

abs(dividend);if

(divisor > dividend)

return res*sign;

while

(dividend !=

1&& dividend !=

0&& dividend > divisor)

dividend -= tmp;

res += cnt;

} res =

(res +

(dividend < divisor ?0:

1))* sign;

return res;}}

;

LeetCode 兩數相除

題目 給定兩個整數,被除數dividend和除數divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數dividend除以除數divisor得到的商。示例 1 輸入 dividend 10,divisor 3輸出 3示例 2 輸入 dividend 7,divisor 3輸出...

LeetCode 兩數相除

給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數 dividend 除以除數 divisor 得到的商。示例 1 輸入 dividend 10,divisor 3 輸出 3 示例 2 輸入 dividend 7,divis...

leetcode 兩數相除

兩數相除跳轉 相同的值,直接返回 if dividend divisor return flag 1 1 大於半數的值,直接返回 if divisor integer.min value 1 dividend divisor return flag 1 1 尋找到乙個最大的除數的倍數 int i f...