整数除法
题目:输入两个int类型整数,它们进行除法运算并返回商,要求不得使用“*”,“/”,“%”,当发生溢出时,返回最大的整数值。假设除数不能为0。
解题思路:
O(n):循环地从被除数里面减去除数,当最后一步被除数减去除数小于0时,循环次数就是结果。
O(log n):对上述的解法进行优化,当被除数大于除数时,比较判断被除数是否大于除数的2倍,如果是,继续判断被除数是否大于除数的4倍,8倍等等。如果被除数最多大于除数的2^k倍,将被除数减去除数的2的k次方倍,然后重复刚才的步骤。最终的次数=第一次的倍数+第二次的倍数+…1倍
public class Division {
public int divides(int a, int b){ //时间复杂度 O(n)
if (a == -Integer.MAX_VALUE && b == -1){
return Integer.MAX_VALUE;
}
int negative = 2; //用来判断结果的±
if (a < 0){
negative--;
a = - a;
}
if (b < 0){
negative--;
b = - b;
}
int result = 0;
while (a >= b){
if (a - b >= 0) {
a -= b;
result++;
}
else break;
}
return negative == 1 ? -result : result;
}
public int divide(int a, int b){ //时间复杂度 O(log n)
if (a == -Integer.MAX_VALUE && b == -1){
return Integer.MAX_VALUE;
}
int negative = 2;
if (a > 0){
negative--;
a = - a;
}
if (b > 0){
negative--;
b = - b;
}
int result = divideCode(a, b);
return negative == 1 ? -result : result;
}
private int divideCode(int a, int b) {
int result = 0;
while (a <= b){
int value = b;
int quotient = 1;
while (value >= -Integer.MAX_VALUE / 2 && a <= value + value){
quotient += quotient;
value += value;
}
result += quotient;
a -= value;
}
return result;
}