給定兩個整數,被除數 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...