LeetCode - Divide Two Integers

来源:互联网 发布:css 开发工具 知乎 编辑:程序博客网 时间:2024/06/16 18:10

https://leetcode.com/problems/divide-two-integers/

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

If it is overflow, return MAX_INT.

这道题的解法一个是不断地用被除数减去除数,直到被除数比除数小为止。这个解法时间是O(n)

另外一个解法就是把除数不断左移一位,直到比被除数大为止,然后被除数再减去左移后比被除数小的最大值,再重复上述过程,直到被除数比除数小为止。

这个解法的时间复杂度是 O(lgn)

比较麻烦的就是各种corner case!!!注意,Math.abs(Integer.MIN_VALUE)等于它自己,并不会返回一个正值。而且如果被除数最高位是1(比如Integer.MAX_VALUE),那么除数不管怎么左移都可能不会比被除数大,因为一到最右边再移就移出32位了,所以移位的时候用long来移,这样循环终止条件才有效。

代码如下:

    public int divide(int dividend, int divisor) {        if(divisor==0) return Integer.MAX_VALUE;        if(divisor == 1 || divisor==-1){            if(divisor==1) return dividend;            if(divisor==-1){                return dividend == Integer.MIN_VALUE ? Integer.MAX_VALUE: -dividend; //-Integer.MIN_VALUE is bigger than Integer.MAX_VALUE            }        }        if(divisor==Integer.MIN_VALUE) return dividend==Integer.MIN_VALUE? 1: 0;        if(dividend ==0) return 0;                boolean isNeg = true;        if((dividend>0 && divisor>0) || (dividend<0 && divisor<0)) isNeg = false;        int rst = 0;        if(dividend == Integer.MIN_VALUE){            dividend += Math.abs(divisor); //Math.abs(Integer.MIN_VALUE) will still return MIN_VALUE, smart trick to deal with this case            rst++;        }        dividend = Math.abs(dividend);        divisor = Math.abs(divisor);                while(dividend>=divisor){            int val = 1;            long tmp = divisor;            while((tmp<<1) < dividend){                val = val<<1;                tmp = tmp<<1;            }            rst += val;            dividend -= (int)tmp;        }        return isNeg? -rst : rst;    }




0 0
原创粉丝点击