Reverse digits of an integer.
![Uploading 007_553011.jpg . . .]
Example1: x = 123, return 321
Example2: x = -123, return -321
Note:
The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows.
大致意思:反转整型数字。输入一个32位的有符号整型,你的函数应该返回0当整型数字溢出时。
常规解法:这道题虽然简单,但是很容易出错。大家可能会想到的常规解法,就是先将整型数转换成字符串,反转后再转换成整型,但是这种方法有个小问题就是当遇到一个长度为10的整型数,如果个位数很大,正向不溢出,反转后可能溢出,那么结果就会出错的。当然也有对应的解决策略,就是最后接收反转后的整型数的变量声明为long,这样就可以解决这个问题了,当然需要进行溢出判断,只要超过int型的数就返回0。
class Solution {
public:
int reverse(int x) {
stringstream stream;
stream<<abs(x);
string num;
num=stream.str();
int n=num.length();
for(int i=0,j=n-1;i<j;++i,--j)
{
char c=num[i];
num[i]=num[j];
num[j]=c;
}
stringstream st(num);
long y;
st>>y;
if(y>INT_MAX || y<INT_MIN)
return 0;
if(x<0)
return -y;
else
return y;
}
};
代码解释:因为在leetcode中没有C语言的一些库文件,string和int之间的转换函数不会被识别,我们可以采用c++中的流转换。先把这两种方法单独列出来,以后还会经常用。
1、int转string:
int a=10;
string st;
stringstream stream;
stream<<a;
st=stream.str();
2、string转int:
string st="10";
int a;
stringstream stream(st);
stream>>a;
其他解法:每次对整型数进行余10操作,这样每次操作后得到的都是原整型数的个位、十位、百位..等等,然后通过数学运算,可以将整型数通过运算实现反转。反转乘加操作过程的倒数第二步就可以进行溢出判断,因为如果倒数第二步都溢出,乘10以后肯定还是溢出。这个方法不用转换成字符串,比较适合。
class Solution {
public:
int reverse(int x) {
int t,y=0;
while(x!=0)
{
t=x%10;
if(y>INT_MAX/10 || y<INT_MIN/10)
{
return 0;
}
y=y*10+t;
x/=10;
}
return y;
}
};
网友评论