Determine whether an integer is a palindrome. Do this without extra space.
思路:
1. palindrome就是左右对称的数。例如:121.
2. 题目越是简单,也要注意是否有一些极限的情况存在,比如:负数?负数不对称
3. 简单粗暴的方法:把所有的数字都取出来存起来,然后再判断是否对称。但是,题目要求是不能用extra space.就不能全部取出来,而需要变取出来边判断!
4. 可以直接reverse这个数,然后reverse后比较是否相等,但这个方法仍然用了一个空间存储!
5. 另一种,先计算有几位,并同时产生一个10^n的数来取高位的数,每次变化这个数,可以去不同位的数!!
//方法1:reverse后比较,太低效率。
class Solution {
public:
bool isPalindrome(int x) {
//
if(x<0) return false;
int res=0;
int xb=x;
while(x){
int pre=res;
res=res*10+x%10;//看到res在循环中每次×10,就要想到是否会overflow,这个应该成为本能,因为代码中时时刻刻要加保护!!
if(res/10!=pre) return false;
x/=10;
}
return res==xb;
}
};
//方法2:首位分别取一位,然后比较,难点是取首位,其实也还好,可以先计算一共有几位,并生成一个10^n的形式,方便取高位
class Solution {
public:
bool isPalindrome(int x) {
if(x<0) return false;
int y=x;
int low=1,high=1,len=0;
while(x){
len++;
if(x>=10) high*=10;
x/=10;
}
for(int i=0;i<len/2;i++){
if((y/high)%10!=(y/low)%10) return false;
high/=10;
low*=10;
}
return true;
}
};