Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
思路:这道题难点在于边界处理。首先强调:
1)-Integer.MIN_VALUE!=Integer.MAX_VALUE ,所以当被除数为Integer.MIN_VALUE,除数为-1时,需要判断
2)Integer.MIN_VALUE)==Integer.MIN_VALUE,所以需要转型为long
整体思路:以38/2为例
对于38:
38>=4 余34
38>=8 余30
38>=16 余22
38>=32 余6
因为38<64 ,所以38-32余6,包含1<<4==16个2,
对于余数6:
6>=4 余2
因为6<8,所以6-4余2,包含1<<2==2个2
对于余数2:
因为2<4,所以2-2余0,包含1<<1 =1个2
对于余数0:
因为小于除数,所以到此结束。
最后共包含:16+2+1 = 19个2,结果为19
public int divide(int dividend, int divisor) {
if((divisor==0)||(dividend==Integer.MIN_VALUE&&divisor==-1)) return Integer.MAX_VALUE;//因为Integer.MIN_VALUE/-1=Integer.MIN_VALUE,不信的话可以自己试一下
int result = 0;
int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;
long bd = Math.abs((long)dividend);
//注意: Math.abs(Integer.MIN_VALUE)==Integer.MIN_VALUE,所以在此转型
long d = Math.abs((long)divisor);
while(bd>=d){
long temp = d;
int c = 1;//因为被除数大于等于除数,所以至少包含一个
while(bd>=(temp<<2)){
temp<<=2;
c<<=2;
}
bd -=temp;
result +=c;
}
return (sign==-1)?-result:result;
}
时间复杂度:O(logn)