29. Divide Two Integers
Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.
Return the quotient after dividing dividend by divisor.
The integer division should truncate toward zero.
Example 1:
Input: dividend = 10, divisor = 3
Output: 3
Example 2:
Input: dividend = 7, divisor = -3
Output: -2
Note:
Both dividend and divisor will be 32-bit signed integers.
The divisor will never be 0.
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 231 − 1 when the division result overflows.
方法1:
思路:
题目规定不能用整除和取余,那么只能利用不断从被除数中减掉数字。基本做法是对于a/b,找到比a小的b * 2^ n, 减掉之后再继续找到新的n,也就是最后将a标示为以b为系数的power sum of 2。
易错点
- 需要处理非常多的edge cases
- 中间会有overflow的情况,需要用long来过渡
Complexity
Time complexity: 取决于dividend和divisor的相对大小,technicallyO(1),因为int是有固定范围的
Space complexity: O(1)
class Solution {
public:
int divide(int dividend, int divisor) {
// if (dividend == 0) return 0;
// if (divisor == 0) return INT_MAX;
if (dividend == INT_MIN) {
if (divisor == 1) return INT_MIN;
else if (divisor == -1) return INT_MAX;
}
int sign = 1;
if (dividend < 0 && divisor > 0 || dividend > 0 && divisor < 0){
sign = -1;
}
int result = 0;
//
//note here the number have to be cast to long first then abs, otherwise cast to overflow
long dividendl = abs((long) dividend);
long divisorl = abs((long) divisor);
while (true){
if (dividendl < divisorl) {
break;
}
int shift = 1;
while(dividendl >= divisorl << shift){
shift ++;
}
result += 1 << (shift - 1);
dividendl -= divisorl << (shift - 1);
}
return result * sign;
}
};