Determine whether an integer is a palindrome. Do this without extra space.
思路:
edge case:
x < 0 ==> false
x == 0 ==> true
x = 10, 100,... ==> false
解法一:
1. 如果input x是负数,直接返回false
2. 考虑overflow情况,因为input x不是overflow:
如果reverse之后没有overflow:1.和原来的数一样,证明是palindrome。2.和原来数不一样,不是palindrome。
如果reverse之后overflow了,则跟原来的数肯定不一样,因为overflow之后自动会变为Integer.MIN_VALUE,这时证明不是palindrome。
所以我们只需将原数reverse一下,若x == reverse,则 palindrome,否则不是。
代码如下:
public boolean isPalindrome(int x) {
if (x < 0){
return false;
}
int y = x;
int rev = 0;
while (y != 0){
rev = rev * 10 + y % 10;
y /= 10;
}
return x == rev;
}
解法二:
不用考虑overflow情况,将原来的数reverse一半,这种情况下reverse不会overflow。 比如12321 reverse=123,x=12。 123321 reverse=123 x=123。如果原数是palindrome,则当原数长度是偶数 最后x==reverse 或 当原数长度是奇数 x==reverse/10。
代码如下:
if (x > 0 && x % 10 == 0){
return false;
}
int rev = 0;
while (x > rev){
rev = rev * 10 + x % 10;
x /= 10;
}
return x == rev || x == rev / 10;
}
思路参考leetcode discussion.