leetcode 29. 兩數相除 擊敗100%

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

public static int divide(int dividend, int divisor) {
        //除數-0的處理
        if (divisor == 0) {
            return Integer.MAX_VALUE;
        }
        //除數=最小整型數的處理
        if (divisor == Integer.MIN_VALUE) {
            if (dividend == Integer.MIN_VALUE) {
                return 1;
            }
            return 0;
        }
        //被除數=最小整型數且除數=-1,結果溢出的處理
        if (dividend == Integer.MIN_VALUE && divisor == -1) {
            return Integer.MAX_VALUE;
        }
        //被除數=0直接返回0
        if (dividend == 0) {
            return 0;
        }
        //被除數、除數正負位標誌
        boolean negtive1 = true;
        boolean negtive2 = true;
        //判斷是否爲正數
        if ((dividend & 0x80000000) == 0) {
            negtive1 = false;
            //變爲負數
            dividend = ~dividend + 1;
        }
        if ((divisor & 0x80000000) == 0) {
            negtive2 = false;
            divisor = ~divisor + 1;
        }
        //記錄最終結果的正負
        if (negtive1 && negtive2 || !negtive1 && !negtive2) {
            negtive1 = false;
        } else {
            negtive1 = true;
        }
        int target = 0;
        int countBit = 0;
        int temp = divisor;
        //模擬除法運算,先找到除數最大可以左移到多少
        while (dividend <= temp) {
            //當temp<= -2的29次方,持續翻倍
            if (temp >= 0xf0000000) {
                temp <<= 1;
                //防止左移去掉了符號位
                temp |= 0x80000000;
                countBit++;
            } else {
                break;
            }

        }
        //模擬除法逐位的運算
        while (countBit >= 0 && dividend <= divisor) {
            int count = 0;
            //由於都是負數,所以被除數應該小於等於temp
            while (dividend <= temp) {
                count++;
                dividend -= temp;
            }
            //做了多少次減法,就是該位除之後的結果
            target += (count << countBit);
            countBit--;
            temp >>= 1;
        }
        //變爲負數
        if (negtive1) {
            target = ~target + 1;
        }
        return target;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章