9. Palindrome Number
Difficulty: Easy
Determine whether an integer is a palindrome. Do this without extra space.
确定一个整形数是否是回文数。要求不使用额外的存储空间。
回文数如:n=1234321、124421等(各位数字反向排列后所得数与原来数相等)
注意:
1.小数、负数没有回文数
2.数0~9都是回文数
分析:
题目要求空间复杂度为O(1),所以不能考虑把它转化为字符串然后reverse比较的方法。也不能像解决Reverse Integer问题一样翻转数字,因为可能造成溢出。
因此只能选择分离数字的方法,从两头依次取数字比较,向中间推进。当然要用到大量除10和取余数的计算。
bool isPalindrome(int x) {
int i;
int m=1;
int n1,n2,k;
int temp=x,temp2;
if(x<0)
return false;
if(x<10)
return true;
while(temp>=10) //得到x的位数m
{
temp/=10;
m++;
}
temp=x;
temp2=x;
for(i=1;i<=m/2;i++) // (若是奇数个的数字,跳过中间位)
{
n1=temp%10; //n1 是低位
temp/=10;
k=pow((float)10,m-i);
n2=temp2/k; //n2 是对应的高位
temp2%=k;
if(n1 != n2)
return false;
}
return true;
}
补充:
1.可以将求位数部分直接改成
m=m*10;
后面不要pow()函数了。
2.如:1232154
求低位数字的方法(4、5、1、2···)
n1= temp%10; //n1 是低位
temp /=10;
求高位数字的方法(1、2、3、2···)
k=pow((float)10,m-i);
n2=temp2/k; //n2 是对应的高位
temp2%=k;