题目大意:判定一个整数是否为回文数字,并且不能使用额外的空间。例:12321,是回文数字。
需要注意以下几点:
1、当整数位负数时,肯定不是回文数字;
2、当整数大于等于0,小于10时,肯定是回文数字;
3、不需要要额外的空间,如不能用字符串存储数字进行处理。
思路:
1、处理整数x小于0和小于10的情况。
2、找到x的位数,令x等于此位数的最小整数,例x=12321,n=10000。
3、执行while循环,当x大于0时,判断最后一位和第一位是否相同,即x%10和x/n,如果相同,则更新x为除去最后一位和第一个的整数,例x=12321,更新后为232,并更新n=n/100,;若不同,则返回false。
4、while循环结束,返回true。
下面是ac的代码。运行时间为80ms:
class Solution {
public:
bool isPalindrome(int x) {
if(x<0)
return false;
else if(x<10)
return true;
int m=x/10,n=1;
while(m)
{
m=m/10;
n=n*10;
}
while(x>0)
{
if(x%10!=x/n)
return false;
x=(x%n)/10;
n/=100;
}
return true;
}
};
class Solution {
public:
bool isPalindrome(int x) {
if (x < 0) return false;
int p1 = 0, p2 = x;
while (p2 > 0) {
p1 = p1*10 + p2%10;
p2 /= 10;
}
return p1 == x;
}
};
还有一个进行改进的代码,只使用一个变量,且只判断一半的位数,如下:
class Solution {
public:
bool isPalindrome(int x) {
if(x<0|| (x!=0 &&x%10==0)) return false;
int sum=0;
while(x>sum)
{
sum = sum*10+x%10;
x = x/10;
}
return (x==sum)||(x==sum/10);
}
};