兩數相除

思路一

不能用除法,那就用乘法,設置一個計數器result,然後通過比較result*divisordividend的大小,讓計數器累加,不滿足條件跳出循環即可。先對除數和被除數進行處理,都取絕對值,最後返回結果的時候再處理,因爲題目設置的是整數範圍,所以爲了確保處理的正確性,使用long類型的臨時變量。

    public static int divide(int dividend, int divisor) {
        if (dividend == 0){
            return 0;
        }
        long result = 0;
        boolean tag = true;
        if ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)){
            tag = false;
        }
        long temp1 = dividend;
        long temp2 = divisor;
        if (temp1 < 0){
            temp1 = - temp1;
        }
        if (temp2 < 0){
            temp2 = - temp2;
        }
        while (true){
            if (result * temp2 <= temp1){
                result++;
            }else {
                break;
            }
        }
        result -= 1;
        if (tag){
            if (result > Integer.MAX_VALUE){
                return Integer.MAX_VALUE;
            }else {
                return (int) result;
            }
        }else {
            if (result < Integer.MIN_VALUE){
                return Integer.MAX_VALUE;
            }else {
                return (int) -result;
            }
        }
    }

結果超時了。。。。。。。。。。因爲如果divisor的絕對值很小,比如1,而dividend卻很大,比如是Integer.MAX_VALUE,這樣時間複雜度就太高了。

思路二

在思路一的基礎上進行優化,思路一相當於每次都減divisor,可以讓其成倍的減,第一次減divisor,下一次就減2*divisor

假設divisor + divisor * 2 + divisor * 2 ^ 2 + divisor * 2 ^ 3 + ... + divisor * 2 ^ n = dividend。那麼我們總共只進行了n次操作,這個時間複雜度顯然就是O(log(dividend / divisor))。而如果divisor + divisor * 2 + divisor * 2 ^ 2 + divisor * 2 ^ 3 + ... + divisor * 2 ^ n > dividend,但是divisor + divisor * 2 + divisor * 2 ^ 2 + divisor * 2 ^ 3 + ... + divisor * 2 ^ (n - 1) < dividend,那麼我們就要以dividend - (divisor + divisor * 2 + divisor * 2 ^ 2 + divisor * 2 ^ 3 + ... + divisor * 2 ^ (n - 1))爲被減數進行重複的操作,即從divisor開始減起。直至我們的被減數小於divisor爲止。
 

public static int divide(int dividend, int divisor) {
        if (dividend == 0){
            return 0;
        }
        long result = 0;
        boolean tag = true;
        if ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)){
            tag = false;
        }
        long temp1 = dividend;
        long temp2 = divisor;
        if (temp1 < 0){
            temp1 = - temp1;
        }
        if (temp2 < 0){
            temp2 = - temp2;
        }
        while (temp1 >= temp2){
            long k = 1;
            long t = temp2;
            while (temp1 >= t) {
                temp1 -= t;
                result += k;
                k += k;
                t += t;
            }
        }
        if (tag){
            if (result > Integer.MAX_VALUE){
                return Integer.MAX_VALUE;
            }else {
                return (int) result;
            }
        }else {
            if (result < Integer.MIN_VALUE){
                return Integer.MAX_VALUE;
            }else {
                return (int) -result;
            }
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章