题目:[LCR 001](https://leetcode.cn/problems/powx-n/solutions/238559/powx-n-by-leetcode-solution/)
解法一:快速除 + 位运算
该解法利用减法实现除法,每次尝试使用a减去减数的2倍(位运算),若能够减去,则b再翻倍,计算能够减去几次,减不下时,再对余数执行相同的操作,能够减去的次数就是答案。
例如:取a=23,b=2,b的变化如下:2->4->8->16,次数count的变化如下1->2->4->8,最后a-b=23-16=7。再对7再执行一次上述过程,b:2->4,count:1->2,a-b=3。然后对3再执行一次,b:2,count:1,a-b=1,1已经小于原b=2,可以结束了,最后计数一下每轮的count是多少8+2+1=11,就是我们要的答案啦!
class Solution {
public int divide(int a, int b) {
if (a == Integer.MIN_VALUE) {
if (b == 1) {
return Integer.MIN_VALUE;
} else if (b == -1) {
return Integer.MAX_VALUE;
}
}
if (b == Integer.MIN_VALUE) {
if (a == Integer.MIN_VALUE) {
return 1;
} else {
return 0;
}
}
boolean flag = false;
if (a == 0) {
return 0;
}
//flag取反,而不是设置为true
if (a > 0) {
a = -a;
flag = !flag;
}
if (b > 0) {
b = -b;
flag = !flag;
}
if (a > b) { //此时a和b都为负数,注意判断
return 0;
}
int res = quickDivide(a, b);
return flag ? -res : res;
}
public int quickDivide(int a, int b) {
int res = 0;
while (a <= b) {
int temp = b;
int count = 1;
//考虑翻倍是否会越界
while (temp >= Integer.MIN_VALUE >> 1 && a <= temp << 1) {
temp <<= 1;
count <<= 1;
}
a -= temp;
res += count;
}
return res;
}
}
注意点:
- 题目中要求只能使用整型,所以需要考虑越界问题,每当变量取反时,都要考虑该变量是否为-231,否则会出现越界问题
- 再对b翻倍时,也需要考虑翻倍后的b是否会越界
- 当被除数或除数为正数时,
flag
应该取反,而不是设置为true