1. 程式人生 > >LeetCode 29兩數相除

LeetCode 29兩數相除

解法 如果 += 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兩數相除