题目 官网oj:
法一 使用字符串操作:
将所给的整数利用取余运算得到字符串,此时得到的字符串实际上是原来整数的"颠倒的数",如需将其正序,可以使用stack,本题不需要,因为如果该数是回文数,那么其颠倒以后仍然是一个回文数。得到字符串以后,从左边第一位开始和对应回文位置的字符一一比较,只需要比较length() / 2个位置(如果字符串长度为奇数,那么正中间那个字符不影响整个数的回文性),如果有不同,则返回false,不是回文数,若程序走到了整个for循环以后,则返回true,是回文数。
class Solution {
public:
bool isPalindrome(int x) {
//如果是个负数,那不可能是回文数了
if(x<0)
return false;
string s;
while(x){
s+=x%10+'0';
x/=10;
}
for(int i=0;i<s.length()/2;i++)
if(s[i]!=s[s.length()-i-1])
return false;
return true;
}
};
法二 构造对应的回文数
根据给出的整数构造其对应的回文数,如果这两个数相等,那么该整数就是回文数,比如给出的数是1234,则构造出的回文数是4321,两者不等,故1234不是回文数,如果给出的整数是12321,是个回文数,那么构造出来的回文数也是12321。
class Solution {
public:
bool isPalindrome(int x) {
//b为构造的回文数,longlong是因为原本给出的2开头的9位数,若其个位为4,则构造出的回文数是4开头的9位数,超过int的最大值了
long long a=x,b=0;
if(x<0)
return false;
while(a){
//依次获得原数的个位
int c=a%10;
//a每次右移一位
a/=10;
//b左移一位后加上新的个位数
b=b*10+c;
}
//如果构造的回文数和原数相等,则是回文数
return b==x;
}
};
法三 反转一半数字
法二构造出了完整的原数的回文数,事实上只需要构造一半的回文数,然后判断两者是否相等,需要主义一些细节,见下代码。官方题解
class Solution {
public:
bool isPalindrome(int x) {
// 特殊情况:
// 如上所述,当 x < 0 时,x 不是回文数。
// 同样地,如果数字的最后一位是 0,为了使该数字为回文,
// 则其第一位数字也应该是 0
// 只有 0 满足这一属性
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int revertedNumber = 0;
while (x > revertedNumber) {
revertedNumber = revertedNumber * 10 + x % 10;
x /= 10;
}
// 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。
// 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,
// 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
return x == revertedNumber || x == revertedNumber / 10;
}
};