LeetCode 29兩數相除
阿新 • • 發佈:2018-08-07
解法 如果 += mod ide left 溢出 輸入 iso
給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算符。
返回被除數 dividend 除以除數 divisor 得到的商。
示例 1:
輸入: dividend = 10, divisor = 3
輸出: 3
示例 2:
輸入: dividend = 7, divisor = -3
輸出: -2
說明:
- 被除數和除數均為 32 位有符號整數。
- 除數不為 0。
- 假設我們的環境只能存儲 32 位有符號整數,其數值範圍是 [?231, 231 ? 1]。本題中,如果除法結果溢出,則返回 231 ? 1。
解法
- 對於存在整數上下界的問題可以直接轉化為long型,計算完畢之後統一判斷是否越界
- 為了方便計算將除數與被除數統一轉化為正數,商的符號單獨判斷
- 除法本質還是計算倍數關系,可以使用循環減,通過計算減了多少次得出倍數關系
- 在循環減時註意使用倍增的逼近方式:除數以翻倍的方式遞增,來達到快速逼近被除數的目的
代碼
class Solution { public int divide(int dividend, int divisor) { long dividendLong = dividend; long divisorLong = divisor; boolean positive = true; positive = (dividend < 0) != positive; positive = (divisor < 0) != positive; dividendLong = Math.abs(dividendLong); divisorLong = Math.abs(divisorLong); long quotient = 0; while (dividendLong >= divisorLong) { long dividenLongLeft = dividendLong; long cnt = 0; for (long divisorSum = divisorLong; divisorSum <= dividendLong; divisorSum += divisorSum) { cnt += divisorSum > divisorLong ? cnt : 1; dividenLongLeft = dividendLong - divisorSum; } dividendLong = dividenLongLeft; quotient += cnt; } quotient = positive ? quotient : -quotient; return quotient > Integer.MAX_VALUE || quotient < Integer.MIN_VALUE ? Integer.MAX_VALUE : (int) quotient; } }
LeetCode 29兩數相除