不能使用乘法,除法和mod operator,实现除法功能。
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
用减法可以实现,但是太慢了。算法里所做的优化都是为了节省时间。
不能忽视溢出的问题。例如,被除数是Integer.MIN_VALUE,除以-1,得到的结果对于Int型来说就溢出了,因此返回Integer.MAX_VALUE
先处理符号,处理两个极端情况。其余的先转为long正数后递归处理。
除数每次左移位数都增加,这加快了运算效率。把每次递归产生的左移次数都加起来,即是结果。
Java代码:
public int divide(int dividend, int divisor) { int sign = ((dividend ^ divisor)>>>31) == 1? -1:1; if (dividend == 0) { return 0; } if (divisor == 0) { return Integer.MAX_VALUE; } if(divisor == -1 && dividend == Integer.MIN_VALUE) { return Integer.MAX_VALUE;//overflow } long n1 = Math.abs((long) dividend);//avoid overflow long n2 = Math.abs((long) divisor); return (int) (div(n1,n2)*sign); } public long div(long n1, long n2){ if (n1 < n2) { return 0; } int i = 0; while(n1 > (n2 << (i+1))){ i++; } return (1<<i) + div(n1 - (n2<<i), n2); }
这个问题有3点启示:
1、注意溢出的问题,该转换的就转换
2、关注运行效率的问题
3、移位方法的运用