思路一
不能用除法,那就用乘法,设置一个计数器,然后通过比较与的大小,让计数器累加,不满足条件跳出循环即可。先对除数和被除数进行处理,都取绝对值,最后返回结果的时候再处理,因为题目设置的是整数范围,所以为了确保处理的正确性,使用类型的临时变量。
public static int divide(int dividend, int divisor) {
if (dividend == 0){
return 0;
}
long result = 0;
boolean tag = true;
if ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)){
tag = false;
}
long temp1 = dividend;
long temp2 = divisor;
if (temp1 < 0){
temp1 = - temp1;
}
if (temp2 < 0){
temp2 = - temp2;
}
while (true){
if (result * temp2 <= temp1){
result++;
}else {
break;
}
}
result -= 1;
if (tag){
if (result > Integer.MAX_VALUE){
return Integer.MAX_VALUE;
}else {
return (int) result;
}
}else {
if (result < Integer.MIN_VALUE){
return Integer.MAX_VALUE;
}else {
return (int) -result;
}
}
}
结果超时了。。。。。。。。。。因为如果的绝对值很小,比如1,而却很大,比如是Integer.MAX_VALUE,这样时间复杂度就太高了。
思路二
在思路一的基础上进行优化,思路一相当于每次都减,可以让其成倍的减,第一次减,下一次就减,
假设divisor + divisor * 2 + divisor * 2 ^ 2 + divisor * 2 ^ 3 + ... + divisor * 2 ^ n = dividend。那么我们总共只进行了n次操作,这个时间复杂度显然就是O(log(dividend / divisor))。而如果divisor + divisor * 2 + divisor * 2 ^ 2 + divisor * 2 ^ 3 + ... + divisor * 2 ^ n > dividend,但是divisor + divisor * 2 + divisor * 2 ^ 2 + divisor * 2 ^ 3 + ... + divisor * 2 ^ (n - 1) < dividend,那么我们就要以dividend - (divisor + divisor * 2 + divisor * 2 ^ 2 + divisor * 2 ^ 3 + ... + divisor * 2 ^ (n - 1))为被减数进行重复的操作,即从divisor开始减起。直至我们的被减数小于divisor为止。
public static int divide(int dividend, int divisor) {
if (dividend == 0){
return 0;
}
long result = 0;
boolean tag = true;
if ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)){
tag = false;
}
long temp1 = dividend;
long temp2 = divisor;
if (temp1 < 0){
temp1 = - temp1;
}
if (temp2 < 0){
temp2 = - temp2;
}
while (temp1 >= temp2){
long k = 1;
long t = temp2;
while (temp1 >= t) {
temp1 -= t;
result += k;
k += k;
t += t;
}
}
if (tag){
if (result > Integer.MAX_VALUE){
return Integer.MAX_VALUE;
}else {
return (int) result;
}
}else {
if (result < Integer.MIN_VALUE){
return Integer.MAX_VALUE;
}else {
return (int) -result;
}
}
}