[LeetCode] 29. Divide Two Integers
Problem
Given two integers dividend
and divisor
, divide two integers without using multiplication, division, and mod operator.
The integer division should truncate toward zero, which means losing its fractional part. For example, 8.345
would be truncated to 8
, and -2.7335
would be truncated to -2
.
Return the quotient after dividing dividend
by divisor
.
Note: Assume we are dealing with an environment that could only store integers within the 32-bit signed integer range: [−2^31, 2^31 − 1]
. For this problem, if the quotient is strictly greater than 2^31 - 1
, then return 2^31 - 1
, and if the quotient is strictly less than -2^31
, then return -2^31
.
Example 1:
Input: dividend = 10, divisor = 3
Output: 3
Explanation: 10/3 = 3.33333.. which is truncated to 3.
Example 2:
Input: dividend = 7, divisor = -3
Output: -2
Explanation: 7/-3 = -2.33333.. which is truncated to -2.
Constraints:
- -
2^31 <= dividend, divisor <= 2^31 - 1
divisor != 0
Solution
class Solution {
public int divide(int dividend, int divisor) {
// (x << n) -> (x * 2^n)
// (1 << 31) = 2^31 = -2,147,483,648 (INT range)
// (1 << 31) - 1 = 2,147,483,647 (INT range)
// Edge case (-2,147,483,648 / -1)
if (dividend == 1 << 31 && divisor == -1)
return (1 << 31) - 1;
int absDividend = Math.abs(dividend), absDivisor = Math.abs(divisor);
int quotient = 0;
int tmpQuo = 0;
while (0 <= absDividend - absDivisor) {
// absDivisor << tmpQuo + 1은 왜 Time Limit이 나올까?;;
for (tmpQuo = 0; 0 <= absDividend - (absDivisor << tmpQuo << 1); tmpQuo++);
quotient += 1 << tmpQuo;
absDividend -= absDivisor << tmpQuo;
}
return (dividend > 0) == (divisor > 0) ? quotient : -quotient;
}
}
Leave a comment