题目描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
解题思路
反转一个整数其实很简单,只需要使用如下操作:
res = 0;
while(num!=0)
{
res = res*10+num%10;
num/=10;
}
但是难点在于如何在一个计算结果溢出之前发现它溢出了
可以考虑以下:(先假设num为正数)
1.如果res = res*10+num%10溢出,那么意味着res∗10+nums%10>INT_MAXres*10+nums\%10>INT\_MAXres∗10+nums%10>INT_MAX,即res>INT_MAX−nums%1010res>\frac{INT\_MAX-nums\%10}{10}res>10INT_MAX−nums%10
2.因此可以得到res>INT_MAX10res>\frac{INT\_MAX}{10}res>10INT_MAX
3.并且有nums%10>7nums\%10 >7nums%10>7
- 满足1或者同时满足2、3是等价的
因此,我们可以在每次循环后判断2、3两点,即可判断下一次操作是否会溢出;对于负数,我们只可以类推得到判断条件
class Solution {
public:
int reverse(int x) {
int res = 0;
int mod = 0;
while(x!=0)
{
mod = x%10;
x/=10;
if(res>INT_MAX/10 ||(res == INT_MAX/10 && mod > 7))return 0;
if(res<INT_MIN/10 ||(res == INT_MIN/10&&mod<-8))return 0;
res = res*10+mod;
}
return res;
return 0;
}
};