0.题目分析
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
首先可以分析如果这个数是负数,肯定不是回文数。
1.方法一 先将整数反转再判断
首先想到的思路是将第2道题的整数反转方法先用于整数反转,然后再判断反转前后两数字是否相同。
代码比较简单,如下:
class Solution {
public:
bool isPalindrome(int x) {
int a = 0;
int b=x;
if (x >= 0)
{
while (x / 10)
{
a = a * 10 + x % 10;
x /= 10;
}
a = a * 10 + x % 10;
if (a==b)
{
return true;
}
else
return false;
}
else
return false;
}
};
有一个循环,循环里的是常数时间复杂度,所以整体时间复杂度是O(log10N)。
2.方法二 反转一半整数
首先考虑平凡的情况:
(1).x<0 显然不是回文数
(2).如果x末尾是0,显然不是回文数。单独将它拿出来的原因是之后算法可能处理不了这种情况。
然后算法进行中怎么判断是否达到一半呢?如果该数是回文数,比如x=1221,那么将原数不断除以10,且同时得到新的数,达到中间的数的情况是x=12和a=12,如果没到达中间的情况,那么x>a;所以可以以此判断是否达到中间;如果该数不是回文数,比如x=5432,那么用此条件判断时,x=5,a=234,虽然如此,但也不影响判断。
还有一个问题是如果x是奇数怎么办?比如x=12321,此时终止循环后,x=12,a=123,只需再比较x==a/10即可。
代码如下:
class Solution {
public:
bool isPalindrome(int x) {
int a = 0;
if(x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
else
{
while (a < x)
{
a = a * 10 + x % 10;
x /= 10;
}
if (a==x||a/10==x)
{
return true;
}
else
return false;
}
}
};
虽然时间复杂度也是O(log10n)但是终止得比较早,时间如下: