给出一个 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溢出,那么意味着 r e s ∗ 10 + n u m s % 10 > I N T _ M A X res*10+nums\%10>INT\_MAX res∗10+nums%10>INT_MAX,即 r e s > I N T _ M A X − n u m s % 10 10 res>\frac{INT\_MAX-nums\%10}{10} res>10INT_MAX−nums%10 2.因此可以得到 r e s > I N T _ M A X 10 res>\frac{INT\_MAX}{10} res>10INT_MAX 3.并且有 n u m s % 10 > 7 nums\%10 >7 nums%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; } };