[LeetCode] 50. Pow(x, n)
Problem
Implement pow(x, n)
, which calculates x
raised to the power n
(i.e., x^n
).
Example 1:
Input: x = 2.00000, n = 10
Output: 1024.00000
Example 2:
Input: x = 2.10000, n = 3
Output: 9.26100
Example 3:
Input: x = 2.00000, n = -2
Output: 0.25000
Explanation: 2-2 = 1/22 = 1/4 = 0.25
Constraints:
-100.0 < x < 100.0
-2^31 <= n <= 2^31-1
n
is an integer.-10^4 <= x^n <= 10^4
Solution
class Solution {
public double myPow(double x, int n) {
double result = 1L;
if (x == 1L || (x == -1L && n % 2 == 0)) return result;
else if (x == -1L && n % 2 != 0) return -result;
// Overflow case : 0으로 수렴
else if (n == Integer.MIN_VALUE) return 0L;
for (int i = 0; i < Math.abs(n); i++)
result *= x;
if (n < 0) return 1 / result;
else return result;
}
}
Explanation
- n이 양수라면 x가 양수던 음수던 n제곱을 계산해주면 되지만, n이 음수라면 반환값이 분수가 된다. 이는 n이 양수일 때와 음수일 때 모두를 계산해주어야 한다는 의미가 되고, 함수가 길어질 수 있다.
n의 절대값으로 계산
을 마친 뒤, n이 음수라면 분수로 만들어 반환하면 1가지 경우의 수만 계산하면 된다. - 곱셈을 해주어야 하기 때문에, 반환할 값인 변수 result를 0이 아닌 1L로 초기화한다.
- for반복문을 작성해 n의 절대값으로 n이 양수일 경우의 result값을 구하고 난뒤, n이 음수라면 분수로 반환하도록, n이 양수라면 분수로 변환없이 그대로 변수 result값을 반환하도록 if조건문을 작성한다.
double result = 1L; for (int i = 0; i < Math.abs(n); i++) result *= x; if (n < 0) return 1 / result; else return result;
- x가 1 혹은 -1인 경우에 반환할 값은 1L 혹은 -1L이 되므로 계산 시간을 줄이기 위해 if조건문을 상단에 작성한다.
if (x == 1L || (x == -1L && n % 2 == 0)) return result; else if (x == -1L && n % 2 != 0) return -result;
- 그리고 n의 절대값을 구하는 과정에서 n이 int 형 정수의 최소 값인 -2^31일 경우 Overflow가 발생할 수 있는 경우를 대비해 if조건문을 추가 작성한다.
- n이 -2^31일 경우에는 반환 값인 변수 result가 0으로 수렴하여 결국 0으로 처리되기 때문에 0을 반환하도록 한다.
// Overflow case : 0으로 수렴 else if (n == Integer.MIN_VALUE) return 0L;
Leave a comment