給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算子。
返回被除數 dividend 除以除數 divisor 得到的商。
整數除法的結果應當截去(truncate)其小數部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
被除數為0直接返回0
除數為1直接返回被除數
除數為-1時, 如果被除數是整型最小值, 則返回整型最大值(整型最小值取相反數會溢位), 否則返回被除數的相反數
其餘結果
記錄結果正負, 也就是看被除數和除數的正負情況, 同號為正, 反之為負
將被除數和除數取絕對值, 在遞迴方法中計算, 返回絕對值的計算結果
根據上面記錄的正負結果, 返回最後結果
遞迴方法舉例:10 / 3, 比較10和3的大小, 10比3大, 則商必定大於1, 然後將3翻倍為6, 比較10和6, 還是10大, 則商必定大於2, 再將6翻倍為12, 現在是10小, 所以最終結果必定在2到4之間, 不妨將10 - 6 = 4, 比較4於3, 4大, 則結果至少為2 + 1 = 3, 將3翻倍為6, 4小於6, 於是重複類似的操作, 4 - 3 = 1, 1小於3, 直接返回2 + 1 + 0 = 3 為最終結果, 看**會清晰得多
int a = integer.min_value;
system.out.
println
(a -1)
;// 整型最小值 - 1 = 整型最大值
class
solution
if(divisor ==1)
if(divisor ==-1
)// 記錄結果正負的符號
int sign =1;
if(dividend >
0&& divisor <
0|| dividend <
0&& divisor >0)
// 原先採用絕對值來計算, 但是整數最小值取相反數會溢位
// 所以將數統統置為負數, 直接用兩個負數計算
dividend = dividend >0?
-dividend : dividend;
divisor = divisor >0?
-divisor : divisor;
int result =
div(dividend, divisor)
;return sign ==
1? result :
-result;
}private
intdiv
(int dividend,
int divisor)
// 被除數比除數小(絕對值大), 則被除數至少有1個除數(數值比較)
// count記錄被除數的數值等於幾個除數
int count =1;
// 既然count至少為1, 那就嘗試讓除數翻倍, 看看count能否達到2
int curdivisor = divisor;
while
(dividend < curdivisor + curdivisor && curdivisor + curdivisor <0)
// 還需要檢查dividend減去curdivisor後是否還能包括幾個divisor
return count +
div(dividend - curdivisor, divisor);}
}
LeetCode 029 兩數相除
029 兩數相除 給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數 dividend 除以除數 divisor 得到的商。示例 1 輸入 dividend 10,divisor 3 輸出 3 示例 2 輸入 dividen...
LeetCode029 兩數相除
給定兩個整數,被除數dividend和除數divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數dividend除以除數divisor得到的商。示例 1 輸入 dividend 10,divisor 3輸出 3示例 2 輸入 dividend 7,divisor 3輸出 2說...
LeetCode 兩數相除
題目 給定兩個整數,被除數dividend和除數divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數dividend除以除數divisor得到的商。示例 1 輸入 dividend 10,divisor 3輸出 3示例 2 輸入 dividend 7,divisor 3輸出...