题目:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
关于这题一开始我觉得很简单,以为就是把每个数取出来,然后再反过来相加,然后发现有正负数的问题,还专门讨论了是否为正,下面为开始的有问题的代码
class Solution {
public:
int reverse(int x) {
int a=x;
int s=0;
if(x<0)
a=-x;
while(a>0){
s=s*10+a%10;
a/=10;
}
if(x>0)
return s;
else
return -s;
}
};
这个看起来使用123或者-123这样的可以实现反转,但是发现测试用例有错误,如:1534236469 反转之后会导致溢出,按照题目要求,应该是返回0;
然后想了一下判断了一下最后那个值是否大于INT_MAX发现不对。因为此时已经溢出,于是推理到判断前面一次是否大于INT_MAX/10还是有问题,没有考虑清楚就比如假设intmax为1234
那么如果前一次为123的话,而剩下的一位是5,那么12310之后+5还是溢出了,所以当前一次的数值=INT_MAX/10时,要考虑具体的最后一位小于INT_MAX%10(相当于取INT_MAX的个位)如下面代码的pop<7一样。。但是还是有问题。
我上面的代码全部把x看成正数处理,然后判断正负号。但是最小的下限也就是INT_MIN的数值部分是比INT_MAX多1的。所以要分类讨论。
最后看了官方的答案,才发现自己想多了,其实根本不用判断正负号,因为当负数时,如-123。从前开始取位数就是-310*10+(-2)*10+(-1),而负数取模还是负的。(其他语言好像不一样)。所以和123的规则是一样的。。所以最后官方代码如下
class Solution {
public:
int reverse(int x) {
int pop;
int temp=0;
while(x!=0){
pop=x%10;
x/=10;
if(temp>INT_MAX/10|temp==INT_MAX/10&pop>7)
return 0;
if(temp<INT_MIN/10|temp==INT_MIN/10&pop<-8)
return 0;
temp=temp*10+pop;
}
return temp;
}
};
其中
if(temp>INT_MAX/10|temp==INT_MAX/10&pop>7)
if(temp<INT_MIN/10|temp==INT_MIN/10&pop<-8)
两个判断比较重要!