原题链接:https://leetcode-cn.com/submissions/detail/3096732/
解决方案一:采用二分法,能够较快的解决不采用除法,乘法以及mod方法来计算两个整数的除法的问题。
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);
}
方法二:采用位运算方式进行除法运算:
public int divide(int dividend, int divisor) {
if(dividend > Integer.MAX_VALUE ||dividend < Integer.MIN_VALUE ||divisor > Integer.MAX_VALUE||divisor < Integer.MIN_VALUE){
return Integer.MAX_VALUE;
}
if(divisor == 0){
return Integer.MAX_VALUE;
}
if(dividend == Integer.MIN_VALUE){
if(divisor == -1 || divisor == 1){
return divisor == -1 ? ~dividend : dividend;
}
}
int flag = 1;
long div=dividend, dor=divisor;
if (div<0) {
flag *= -1;
div *= -1;
}
if (dor<0){
flag *= -1;
dor *= -1;
}
int re = 0;
while (div >= dor){
long aa = 1, temp = dor;
while (temp < div>>1){
temp <<= 1;
aa <<= 1;
}
div -= temp ;
re += aa ;
}
return re*flag;
}
这两种方式都能够较快的计算和通过测试,关键点的思路在于打破常规的思路,例如首先想到的就是循环相减,不过当两个数之间的差值很大的是偶就会出现很严重的问题,超时,所以我们采用一种代替除法,但是非常类似的方法,如位移,这个向左则相当于乘以2,向右则相当于除以2。同样的二分法是从数学逻辑的角度计算的,而且也比较快速。