分析
-
本题的考点:数学。
-
每次取出
x
的最低位加到结果中即可,即如果结果存储在r
中的话,$r = r \times 10 + x \% 10$,然后让$x/=10$,直到x
为0为止。 -
因为不能使用64位整数,所以我们需要考虑边界情况,因为反转后可能越界,存在两种越界情况:
(1)假设int
的最大值为INT_MAX
,则当$r \times 10 + x \% 10 > INT\_MAX$,即$r > \frac{INT\_MAX - x \%10}{10}$的话越界,返回0;
(2)假设int
的最小值为INT_MIN
,则当$r \times 10 + x \% 10 < INT\_MIN$,即$r < \frac{INT\_MIN - x \%10}{10}$的话越界,返回0;
代码
- C++
class Solution {
public:
int reverse(int x) {
int r = 0;
while (x) {
if (r > 0 && r > (INT_MAX - x % 10) / 10) return 0;
if (r < 0 && r < (INT_MIN - x % 10) / 10) return 0;
r = r * 10 + x % 10;
x /= 10;
}
return r;
}
};
- Java
class Solution {
public int reverse(int x) {
int r = 0;
while (x != 0) {
if (r > 0 && r > (Integer.MAX_VALUE - x % 10) / 10) return 0;
if (r < 0 && r < (Integer.MIN_VALUE - x % 10) / 10) return 0;
r = r * 10 + x % 10;
x /= 10;
}
return r;
}
}
时空复杂度分析
-
时间复杂度:$O(n)$,
n
为x
的长度。 -
空间复杂度:$O(n)$,
n
为x
的长度。