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.
Solution: This problem need more practice.
1. Deal with corner cases;
2. Think about how to achieve multiply.
Code 1: 32ms
public int divide(int dividend, int divisor) {
if (dividend == 0) {
return 0;
}
if (divisor == 1) {
return dividend;
}
if (divisor == -1) {
return dividend == Integer.MIN_VALUE ? Integer.MAX_VALUE : -dividend;
}
int sign = ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)) ? -1 : 1;
long dvd = Math.abs((long)dividend);
long dvs = Math.abs((long)divisor);
int res = 0;
while (dvd >= dvs) {
long tmp = dvs, mul = 1;
while (tmp + tmp <= dvd) {
tmp += tmp;
mul += mul;
}
dvd -= tmp;
res += mul;
}
return sign * res;
}
Code 2: 27ms Same idea, minor difference
public int divide(int dividend, int divisor) {
if (dividend == 0) {
return 0;
}
if (dividend == Integer.MIN_VALUE && divisor == -1) {
return Integer.MAX_VALUE;
}
int sign = (dividend > 0) ^ (divisor > 0) ? -1 : 1;
long dvd = Math.abs((long)dividend);// dividend could be integer.min_value
long dvs = Math.abs((long)divisor);
int res = 0;
while (dvd >= dvs) {
long tmp = dvs, mul = 1;
while (tmp << 1 < dvd) {
tmp <<= 1;
mul <<= 1;
}
dvd -= tmp;
res += mul;
}
return (int)sign * res;
}