将siyang3的解答稍改进了一下。
思路是利用移位操作将一个数转化为2的幂的和的形式。
int范围-2^31 到2^31-1,都换成负数计算可以简化边界检查。
class Solution {
public int divide(int dividend, int divisor) {
if(dividend==Integer.MIN_VALUE&&divisor==-1)return Integer.MAX_VALUE;
if(dividend>0&&divisor>0){
return -divideNegatives(-dividend, -divisor);
}else if(dividend>0){
return divideNegatives(-dividend, divisor);
}else if(divisor>0){
return divideNegatives(dividend, -divisor);
}else{
return -divideNegatives(dividend, divisor);
}
}
private int divideNegatives(int dividend,int divisor){
if(divisor<dividend)return 0;
int cur = 1;
while(divisor<<cur>=dividend&&divisor<<cur<divisor)cur++;
//返回值也使用负数
return divideNegatives(dividend-(divisor<<cur-1),divisor)-(1<<cur-1);
}
}
网友评论