Divide Two Integers
Solution 1
因为只要求获得整数位,所以本题的思路也非常清晰:不断滴增大除数的倍数,寻找恰好不大于被除数的倍数结果,此时的倍数即为商。由于题目中要求不使用乘法、除法和取模运算,因此传统的逐位除尽的思路就要调整,主要是如何获取“恰好合适”的除数的倍数。因为不能用乘除法,所以这里就需要使用移位运算代替:左移乘2,右移除2。因此本题就是不断地通过左移获取除数的合适倍数,从而寻找商。由于只能进行2倍乘法,对于奇数倍的乘法,需要使用多次尝试(3=2+1),直到被除数残差不足一个除数为止。
- 时间复杂度:涉及到质数分解,这个我不会算……
- 空间复杂度: O ( 1 ) O(1) O(1),仅维护常数个状态量
class Solution {
public:
int divide(int dividend, int divisor) {
if (divisor == -1 && dividend == INT_MIN) {
return INT_MAX;
}
if (divisor == 1 || divisor == -1) {
return divisor > 0? dividend: -dividend;
}
int sign = ((dividend >= 0 ) ^ (divisor >= 0)) == 0? 1: -1;
long tmpUp = abs(dividend), tmpDown = abs(divisor);
int ans = 0;
while (tmpUp >= tmpDown) {
long sub = tmpDown, res = 1;
// cout << sub << " " << res << endl;
while (tmpUp >= (sub << 1)) {
sub <<= 1;
res <<= 1;
// cout << sub << " " << res << endl;
}
tmpUp -= sub;
ans += res;
}
return sign > 0? ans: -ans;
}
};
Solution 2
Solution 1的Python实现
class Solution:
def divide(self, dividend: int, divisor: int) -> int:
if divisor == -1 and dividend == -(2**31):
return 2**31 - 1
if abs(divisor) == 1:
return dividend if divisor > 0 else -dividend
sign = 1 if (divisor > 0) ^ (dividend > 0) == 0 else -1
tmpUp = abs(dividend)
tmpDown = abs(divisor)
# print(tmpUp, tmpDown)
ans = 0
while tmpUp >= tmpDown:
sub = tmpDown
res = 1
while tmpUp >= (sub << 1):
sub <<= 1
res <<= 1
# print(sub, res)
tmpUp -= sub
ans += res
return ans if sign == 1 else -ans