一、概述
输入一个整数,翻转并输出。
注意溢出情况。
二、分析
1、我的方法
这个注意溢出情况可真的是好蛋疼,stoi直接用不了了,会报错,自己写stoi也会报错。反正就是出现大于int的最大值的情况就会报错,整个程序中不能出现大于int的情况。
因此我选择在string中进行比较。
首先把输入的整数转换为string。然后翻转。
如果string的数字不超过10个,那么翻转了也不溢出。
如果数字等于10个,那么翻转可能溢出。
在string中进行比较,只需比较10个的情况。若大于,返回0。
很直观。
2、较好的方法
一边乘一边除,不使用string这种花里胡哨的东西。
一边乘指的是ans*10+x%10;
一边除指的是x/10;
这样做完一次之后,ans多一位,x少一位;
判断溢出用ans在*10之前与INT_MAX/10比较,大于它或者等于它但x%10大于7就是溢出,为什么呢,因为INT_MAX的最后一位就是7,如果大于7,那么就溢出。负数的情况也一样。
而且还有一个好处,就是不用判断正负。
三、总结
注意学习这种一位一位处理的方法,比使用string好得多。另外INT_MAX直接可以用,不用算2^31-1,太蠢了。
PS:代码如下:
我的代码:
class Solution {
public:
int reverse(int x) {
string s=to_string(x);
string MAX1="2147483647";
string MAX2="-2147483648";
if(x>=0)
{
std::reverse(s.begin(),s.end());
if(s.length()==10&&s>MAX1)
return 0;
int ans=stoi(s);
return ans;
}
else
{
std::reverse(s.begin()+1,s.end());
if(s.length()==11&&s>MAX2)
return 0;
int ans=stoi(s);
return ans;
}
}
};
较好的代码:
class Solution {
public:
int reverse(int x) {
int ans=0;
while(x!=0)
{
int a=x%10;
if(ans>INT_MAX/10||(ans==INT_MAX/10&&a>7)) return 0;
if(ans<INT_MIN/10||(ans==INT_MIN/10&&a>8)) return 0;
ans=ans*10+a;
x=x/10;
}
return ans;
}
};