Divide Two Integers

Divide Two Integers

问题:

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

思路:

  二分查找

我的代码:

public class Solution {

   public int divide(int dividend, int divisor) {

        if(divisor == 0) return Integer.MAX_VALUE;

        if(dividend == 0) return 0;

        boolean flag = true;

        if((dividend < 0 && divisor > 0)||(dividend > 0 && divisor < 0))

        {

            flag = false;

        }

        long top = Math.abs((long)dividend);

        long down = Math.abs((long)divisor);

        long[] rst = helper(top, down);

        long result = (flag ? rst[0] : -rst[0]);

        if(result > Integer.MAX_VALUE || result < Integer.MIN_VALUE)    return Integer.MAX_VALUE;

        return (int)result ;

    }

    public long[] helper(long dividend, long divisor)

    {

        long[] rst = new long[2];

        if(dividend == divisor)

        {

            rst[0] = 1;

            rst[1] = 0;

            return rst;

        }

        if(dividend < divisor)

        {

            rst[0] = 0;

            rst[1] = dividend;

            return rst;

        }

        long mid = dividend >> 1;

        

        rst = helper(mid, divisor);

        long remain = dividend - (mid << 1) + (rst[1] <<1);

        if(remain >= divisor)

        {

            rst[0] = (rst[0]<<1) + 1;

            rst[1] = remain - divisor;

        }

        else

        {

            rst[0] = (rst[0]<<1);

            rst[1] = remain;

        }

        return rst;

    }

}
View Code

他人代码:

public int divide(int dividend, int divisor) {

        long a = Math.abs((long)dividend);

        long b = Math.abs((long)divisor);

        

        long ret = 0;

        

        while (a >= b) {

            for (long tmp = b, cnt = 1; a >= tmp; tmp <<= 1, cnt <<= 1) {

                ret += cnt;

                a -= tmp;

            }

        }

        

        ret = (((dividend ^ divisor) >> 31) & 1) == 1 ? -ret: ret;

        if (ret > Integer.MAX_VALUE || ret < Integer.MIN_VALUE) {

            return Integer.MAX_VALUE;

        }

        

        return (int)ret;

    }
View Code

学习之处:

  • 判断两个数相乘是否为负数, ret = (((dividend ^ divisor) >> 31) & 1) == 1 ? -ret: ret; 这个方法真简洁
  • 我的代码太过于臃肿,看看别人的代码是如此的简介,我的代码可取之处只是思路更加清晰一点而已
  • 既然不能用乘除法,还可以用移位操作嘛

你可能感兴趣的:(Integer)