Reverse digits of an integer.
Example1: x = 123, return 321 Example2: x = -123, return -321
此题最主要的考点,在于判断反转后的整数不能超出int型的最大值和最小值。
方法一:利用整形运算整除/和求余%,将int型数按个位、十位、百位...存在数组里面,按照从高往低的位次依次比较和int型最大值或最小值比较,如果超出,就返回0
int reverse(int x)
{
int rev[10];
int i=0,j,result=0;
const int Max = pow(long double(2),31)-1;
const int Min = -1*pow(long double(2),31);
if(x/10==0) return x;
do{
rev[i]=(x%10);
x/=10;
i++;
}while(x/10!=0);
rev[i]=(x%10);
if(x>0 && i==9)
{
for(j=0;j<i;j++)
{
int tem = (Max/(int)pow(long double(10),i-j))%10;
if(rev[j]>tem) return 0;
else if(rev[j]==tem) continue;
else break;
}
}
else if(x<0 && i==9)
{
for(j=0;j<i;j++)
{
int tem = (Min/(int)pow(long double(10),i-j))%10;
if(rev[j]<tem) return 0;
else if(rev[j]==tem) continue;
else break;
}
}
for(j=0;j<i;j++)
{
result+=rev[j]*(int)pow(long double(10),i-j);
}
result+=x;
return result;
}
方法二:考虑到转置后int会溢出的问题,将转置后的值设为double型,可以包含溢出的int型范围,转置后与int最大,最小值做比较,超出就return 0
class Solution {
public:
int reverse(int x)
{
vector<int> rev;
int i=0,j;
double result=0;
const int Max = pow(double(2),31)-1;
const int Min = -1*pow(double(2),31);
if(x/10==0) return x;
do{
rev.push_back(x%10);
x/=10;
i++;
}while(x/10!=0);
rev.push_back(x%10);
for(j=0;j<=i;j++)
{
result+=rev[j]*pow(double(10),i-j);
}
if (x>0 && result>Max) return 0;
else if (x<0 && result<Min) return 0;
else return (int)result;
}
};