题目地址:
https://leetcode.com/problems/reverse-integer/
给定一个 32 32 32位整数 x x x,返回其翻转之后的数。如果溢出了则返回 0 0 0。
重点是如何判断溢出。设最小最大整数分别是 m m m和 M M M。如果是上溢出,那么说明 r > 0 r>0 r>0并且 10 r + x % 10 > M 10r+x\% 10>M 10r+x%10>M,则有 10 r > M − x % 10 10r>M-x\% 10 10r>M−x%10,即 r > ( M − x % 10 ) / 10 r>(M-x\% 10)/10 r>(M−x%10)/10,如果是下溢出,那么说明 r < 0 r<0 r<0并且 10 r + x % 10 < m 10r+x\% 10<m 10r+x%10<m,即 r < ( m − x % 10 ) / 10 r<(m-x\% 10)/10 r<(m−x%10)/10。代码如下:
class Solution {
public:
int reverse(int x) {
int res = 0;
while (x) {
// 如果下一步就要溢出了,则返回0
if (res > 0 && res > (INT_MAX - x % 10) / 10) return 0;
if (res < 0 && res < (INT_MIN - x % 10) / 10) return 0;
res = res * 10 + x % 10;
x /= 10;
}
return res;
}
};
时间复杂度 O ( log x ) O(\log x) O(logx),空间 O ( 1 ) O(1) O(1)。