Determine whether an integer is a palindrome. Do this without extra space.(判断一个整型数是否是回文,要求不能借用额外的空间)
1.个人分析
题目中的额外空间应该是指空间复杂度为O(1),所有的负数不属于回文数。
2.个人解法
bool isPalindrome(int x)
{
if(x > INT_MAX || x < 0)
return false;
int count = 0;
long long tmp = abs(x);
while(tmp > 10){
++count;
tmp /= 10;
}
tmp = abs(x);
int low, high;
while (count > 0)
{
high = tmp / pow(10.0, count);
low = tmp % 10;
if(high != low)
return false;
}
return true;
}
该解法试图使用“双指针”方法从整数的两端分别进行比较,但该过程无法实现预期目标结果。
3.参考解法
(1)
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);
}
该解法是通过先取得反转后一半的结果,然后再比较前一半和后一半是否相等,这种方法很好的解决了将整个数字反转后可能出现溢出的情况。
(2)
bool isPalindrome(int x)
{
if(x < 0) return false;
int ranger = 1;
while(x / ranger >= 10)
ranger *= 10;
while(x){
int left = x / ranger;
int right = x % 10;
if(left != right)
return false;
x = (x % ranger) / 10;
ranger /= 100;
}
return true;
}
该解法才正确地解决了个人解法的问题,思路也是通过“俩指针”不断比较左右两端的数字是否相等。
4.总结
刚开始并没有意识到负数不是回文数,所以就认为判断负数是否回文只要判断相应的绝对值就行。另外自己在解决思路上是没错的,无奈找不到合适的具体实现方法,所以还需在实际的操作方法上多积累。
PS:
- 题目的中文翻译是本人所作,如有偏差敬请指正。
- 其中的“个人分析”和“个人解法”均是本人最初的想法和做法,不一定是对的,只是作为一个对照和记录。