leetcode 29 Divide Two Integers

題目詳情

Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.

題目要求咱們在不借助乘法運算、除法運算和模運算的基礎上,求出輸入的兩個整數相除的結果。若是溢出,那麼返回MAX_INT。其中第一個參數是被除數,第二個參數是除數。ide

想法

  • 這道題既然不能借助乘、除、模三種運算,咱們只能運用加減法求結果。
  • 很容易想到,咱們每次用被除數減去除數,進行減法的次數就是最終結果。可是這種方法在遇到被除數很大,而除數很小的狀況時,運算時間太長,會致使超時。
  • 這道題的採起了一種相似‘二分查找’的思想。對於每一次運算,咱們要儘量找出除數的倍數n,使得n倍的除數儘量接近被除數的大小。
  • 如何找到這個倍數n呢?咱們每次將除數翻倍,倍數爲1,2,4,8,16...直到除數的n倍比被除數大。
  • 這個時候咱們就用被除數減去n倍的除數,繼續這樣計算下去。
  • 最後咱們獲得的全部倍數的和,就是最後的答案。
  • 除了這些,這道題還要注意一些邊界狀況的判斷,例如除數或被除數爲0,值溢出等。

解法

public int divide(int dividend, int divisor) {
        boolean isPositive = true;
        
        if((dividend < 0 && divisor >0) || (dividend > 0 && divisor < 0)){
            isPositive = false;
        }
        
        long ldividend = Math.abs((long)dividend);
        long ldivisor = Math.abs((long)divisor);
        
        if(ldivisor == 0)return Integer.MAX_VALUE;
        if(ldividend == 0)return 0;
        
        long lans = ldivide(ldividend, ldivisor);
        
        int ans;
        if (lans > Integer.MAX_VALUE){ 
            ans = (isPositive)? Integer.MAX_VALUE : Integer.MIN_VALUE;
        } else {
            ans = (isPositive) ? (int)lans : -(int)lans;
        }
        return ans;
    }
    private long ldivide(long ldividend, long ldivisor) {
        if (ldividend < ldivisor) return 0;
        
        long sum = ldivisor;
        long multiple = 1;
        while ((sum+sum) <= ldividend) {
            sum += sum;
            multiple += multiple;
        }
        return multiple + ldivide(ldividend - sum, ldivisor);
    }
相關文章
相關標籤/搜索