题目:http://leetcode.com/2012/01/palindrome-number.html
Determine whether an integer is a palindrome. Do this without extra space.
1.输入检测:如果输入的integer是负数,返回false
2.“额外空间”的大坑:用string来存放integer,使用了额外空间
3.“溢出”的大坑:如果把回文数整个倒过来,再比较是否相同,这种方法可能是可行的。但会出现有些整数倒置后溢出,再处理溢出就与具体环境有关了,不具有普遍性
将一个数倒置的算法:
// reverse an integer
int reverse(int num){
assert(num>=0); // for non-negative integers only
int rev = 0;
while(num!=0){
rev = 10*rev + num%10;
num = num/10;
}
return rev;
}
4.好的思路一:
不使用递归来从两端对比数字是否一样:
算法:
bool isPalin(int num){
if(num<0)
return false;
// get the left most digit
int div = 1;
while(num/div!=0){
div *= 10;
}
while(num!=0){
int r = num/div;
int l = num%10;
if(l!=r)
return false;
num = (num%div)/10;
div /= 100; // attention!! 100 not 10, because everytime div shrink by 2 digits
}
return true;
}
5.如果栈空间不算额外空间的话,可以利用递归的方法
算法:(比较难读懂= =)
bool isPalindrome(int x, int &y) {
if (x < 0) return false;
if (x == 0) return true;
if (isPalindrome(x/10, y) && (x%10 == y%10)) {
y /= 10;
return true;
} else {
return false;
}
}
bool isPalindrome(int x) {
return isPalindrome(x, x);
}