重点:
(1)考虑如何降低时间复杂度
(2)考虑数据溢出的问题
解决:
(1)将减法求商变成倍数来求商,可以从o(n)变成o(logn)
(2)正整形数据的最大数据是2^31-1而负整形数据是2的31次方,所以如果我们直接将负数转变为正数来求是会发生越界现象的。我们应该将数据都转为负数,用负数来做减法。
首先有处理边界情况,也就是INT_MIN/-1这种情况,然后我们根据原本数据的正负来确定最后数据的正负,并将数据转变为两个负数。
在执行求商算法。最大的结束条件是被除数小于等于除数。每一次计算的结束条件是value大于等于0并且下一次累加后不能小于等于被除数。中间用一个变量去存储加的次数,作为商的值,再用一个变量累加每次的商值,作为最终商值。
class Solution {
public:
int divide(int a, int b) {
if (a == INT_MIN && b == -1) {
return INT_MAX;
}
int negative = 2;
if (a > 0) {
negative--;
a = -a;
}
if (b > 0) {
negative--;
b = -b;
}
int ret = divideCore(a, b);
return negative == 1 ? -ret : ret;
}
unsigned int divideCore(int a, int b) {
int ret = 0;
// 注意a, b都是负数,所以a <= b就是还可以继续除
while (a <= b) {
int value = b;
unsigned int quo = 1;
while (value >= 0xc0000000 && a <= value + value) {
quo += quo;
value += value;
}
ret += quo;
a -= value;
}
return ret;
}
};
s