문제
정수x가 주어졌을 때 정수를 역으로 출력
생각할 것
Int 범위를 잘 고려해야 한다!
계산 중간 과정에서도 항상 long long형이 되도록 생각해야 한다.
res += (long long)digits.top() * place;
위 코드에서 long long을 붙이지 않으면 결괏값이 int형이 되어 범위를 초과할 수 있음
코드
class Solution {
public:
int reverse(int x) {
int sign = 1;
if(x < 0) {
sign = -1;
x *= -1;
}
stack<int> digits;
while(x > 0){
digits.push(x%10);
x/=10;
}
long long res = 0;
int place = 1;
while(!digits.empty()){
**res += (long long)digits.top() * place;**
place *= 10;
digits.pop();
if(res < -1 * pow(2, 31) || pow(2,31) - 1 < res){
return 0;
}
}
return sign * res;
}
};
개선할 점
위의 코드로 제출을 할 시 런타임 에러가 발생했다.
시간 복잡도가 O(n)이라고 생각했는데.. 어떻게 개선할 수 있을까?
코드를 다음과 같이 간소화 할 수 있다!
결과
class Solution {
public:
int reverse(int x) {
int res = 0;
while(x){
if(res < INT_MIN / 10 || res > INT_MAX / 10) return 0;
res *= 10;
res += x%10;
x /= 10;
}
return res;
}
};
반응형
'Problem solving > LeetCode' 카테고리의 다른 글
[LeetCode] 11. Container With Most Water (C++) (0) | 2023.06.27 |
---|---|
[LeetCode] 8. String to Integer (atoi) (C++) (0) | 2023.06.23 |
[LeetCode] 5. Longest Palindromic Substring (C++) (0) | 2023.06.23 |
[LeetCode] 4. Median of Two Sorted Arrays (C++) (0) | 2023.06.22 |