天天看點

LeetCode第二十九題-整數除法Divide Two Integers

Divide Two Integers

問題簡介:給定兩個整數被除數和除數,運算過程中不使用乘法,除法和模運算符,傳回商,dividend是被除數,divisor是除數.

注:

1.被除數和除數都是32位有符号整數

2.除數永遠不會為0

3.假設我們正在處理一個隻能在32位有符号整數範圍記憶體儲整數的環境:[ - 231,231 - 1],出于此問題的目的假設當除法結果溢出時,函數傳回231 - 1.

舉例:

1:

輸入: dividend = 10, divisor = 3

輸出: 3

2:

輸入: dividend = 7, divisor = -3

輸出: -2

解法一:

利用異或^判斷商的符号,即隻有一個數字為負結果為負,利用位運算符<<進行運算,因為<<代表2的幂數

class Solution {
    public int divide(int dividend, int divisor) {
        if (divisor == 0 || (dividend == Integer.MIN_VALUE && divisor == -1))
        return Integer.MAX_VALUE;
        long m = Math.abs((long)dividend);
        long n = Math.abs((long)divisor);
        long res = 0;
        long sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;
        if (n == 1) return (int)(sign == 1 ? m : -m);
        while (m >= n) {
            long t = n, p = 1;//記錄2的倍數即結果
            while (m >= (t << 1)) {
                t <<= 1;
                p <<= 1;
            }
            res += p;
            m -= t;
        }
        return (int)(sign == 1 ? res : -res);
    }
}
           

注:

1.Integer.MAX_VALUE/Integer.MIN_VALUE:代表int的範圍

2.Math.abs()-絕對值函數

小白刷題之路,請多指教— — 要麼大器晚成,要麼石沉大海