这道题也偏容易, 但要注意题目提示的那几种特殊情况. 这体现了思维是否严谨.
整数反转, 思路很简单, 原数的个位 ==> 结果的最高位. 原数的最高位 ==> 结果的个位. 那么循环一下吧?
while (x)
{
res = res * 10 + x % 10; // 加号前面是先取得的值保持最高位, 后面则是取得原数的个位.
x /= 10; // 裁剪原数, 确保能够从低位到高位的值, 能够被依次取得.
}
这就是这道题的核心了.
特殊情况:
- 后几位是0的情况(10, 100.)? 这个我们的循环已经考虑了, 如果原数的个位是0, res 则会一直保持是0, 直到非0的出现.
- overflow的问题? 检测很简单, 将 res 设为
long, 那你一个int怎么反转都不会超出long的范围了吧? 然后判断 res 和INT_MAX的关系就可以了.
缩减一下上面的循环. 答案有了.
#include <climits>
class Solution {
public:
int reverse(int x) {
long res = 0;
do {
res = res*10 + x%10;
} while (x /= 10);
return res>INT_MAX ? 0 : res;
}
};