判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
- 常规做法,将数字倒置后比较
bool isPalindrome(int x) {
if(x<0||(x%10==0&&x!=0))
return false;//除去特例
unsigned int inv = 0,y = x;
while(y > 0 )
{
inv *=10;
inv += y%10;
y /= 10;
}
return x == inv;
}
- 用string的reverse函数
bool isPalindrome(int x) {
if(x < 0) return false;
string t1 = to_string(x);
string t2 = t1;
reverse(t1.begin(),t1.end());
if( t1 == t2) return true;
else return false;
}
- 利用栈,将数字的后半部分压入栈内,再一一弹出与数字前半段作对比。特别需要注意的是奇数位和偶数位操作的差别
int get_length(int x){//获取整数位数
int leng=0;
while(x)
{
x/=10;
leng++;
}
return leng;
}
bool isPalindrome(int x) {
if(x<0 ||(x%10==0&&x!=0))
return false;
stack<int> mystack;//创建一个栈
int l=get_length(x);//存放整数位数
int p=0;//存放弹出的数据
if(l%2==0)//偶数位操作
{
for(int i=0;i<l/2;i++)
{
p=x%10;
x/=10;
mystack.push(p);
}
for(int j=l/2;j<l;j++)
{
p=x%10;
x/=10;
if(p==mystack.top())
{
mystack.pop();
continue;
}
else return false;
}
return true;
}
else//奇数位操作
{
for(int i=0;i<=l/2;i++)
{
p=x%10;
x/=10;
mystack.push(p);
}
mystack.pop();
for(int j=l/2+1;j<l;j++)
{
p=x%10;
x/=10;
if(p==mystack.top())
{
mystack.pop();
continue;
}
else return false;
}
return true;
}
}