题目要求
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
在不使用乘法,除法和求余操作的情况下,计算两个整数相除的结果。如果溢出了,则返回最大值。
在这里核心思路是使用逆向二分法和递归的思路来进行计算。其中一个难点在于如何处理溢出的情况。在这里我们使用取值范围更广的long来处理数值溢出的场景。其次我们将所有的正负值运算从递归中提取出来,直接判断结果的正负情况并直接在返回最后结果时添上正负值
解题代码
public int divide(int dividend, int divisor) {
//判断最终结果的正负性
boolean isPositive = true;
if((dividend<0&&divisor>0) || (dividend>0&&divisor<0)){
isPositive = false;
}
//判断结束后全部当做正数进行操作
//使用long解决数值溢出情况
long ldividend = Math.abs((long)dividend);
long ldivisor = Math.abs((long)divisor);
if(ldivisor==0) return Integer.MAX_VALUE;
if(ldividend==0 || ldividend<ldivisor) return 0;
long result = divide(ldividend, ldivisor);
if(result>Integer.MAX_VALUE){
return isPositive? Integer.MAX_VALUE : Integer.MIN_VALUE;
}
return (int)(isPositive? result : -result);
}
public long divide(long ldividend, long ldivisor){
if(ldividend<ldivisor) return 0;
long sum = ldivisor;
long result = 1;
//二分法计算结果
while(ldividend >= (sum+sum)){
sum += sum;
result += result;
}
return result + divide(ldividend-sum, ldivisor);
}
想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。