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.
大致意思:反轉(zhuǎn)整型數(shù)字荒吏。輸入一個(gè)32位的有符號整型趁窃,你的函數(shù)應(yīng)該返回0當(dāng)整型數(shù)字溢出時(shí)分衫。
常規(guī)解法:這道題雖然簡單,但是很容易出錯(cuò)堂飞。大家可能會(huì)想到的常規(guī)解法,就是先將整型數(shù)轉(zhuǎn)換成字符串她混,反轉(zhuǎn)后再轉(zhuǎn)換成整型祖很,但是這種方法有個(gè)小問題就是當(dāng)遇到一個(gè)長度為10的整型數(shù),如果個(gè)位數(shù)很大颇蜡,正向不溢出价说,反轉(zhuǎn)后可能溢出,那么結(jié)果就會(huì)出錯(cuò)的风秤。當(dāng)然也有對應(yīng)的解決策略鳖目,就是最后接收反轉(zhuǎn)后的整型數(shù)的變量聲明為long,這樣就可以解決這個(gè)問題了缤弦,當(dāng)然需要進(jìn)行溢出判斷领迈,只要超過int型的數(shù)就返回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;
}
};
代碼解釋:因?yàn)樵趌eetcode中沒有C語言的一些庫文件,string和int之間的轉(zhuǎn)換函數(shù)不會(huì)被識別狸捅,我們可以采用c++中的流轉(zhuǎn)換衷蜓。先把這兩種方法單獨(dú)列出來,以后還會(huì)經(jīng)常用尘喝。
1磁浇、int轉(zhuǎn)string:
int a=10;
string st;
stringstream stream;
stream<<a;
st=stream.str();
2、string轉(zhuǎn)int:
string st="10";
int a;
stringstream stream(st);
stream>>a;
其他解法:每次對整型數(shù)進(jìn)行余10操作朽褪,這樣每次操作后得到的都是原整型數(shù)的個(gè)位置吓、十位、百位..等等缔赠,然后通過數(shù)學(xué)運(yùn)算衍锚,可以將整型數(shù)通過運(yùn)算實(shí)現(xiàn)反轉(zhuǎn)。反轉(zhuǎn)乘加操作過程的倒數(shù)第二步就可以進(jìn)行溢出判斷嗤堰,因?yàn)槿绻箶?shù)第二步都溢出戴质,乘10以后肯定還是溢出。這個(gè)方法不用轉(zhuǎn)換成字符串踢匣,比較適合告匠。
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;
}
};