思路
这道题, 一下就能联想到第7题, 因为回文数不就是倒过来和自己相等吗? 那么我们reverse输入, 对比原输入即可.
实现
个人考虑了如下corner case :
- 负数 : 一律不是
- 0555, +323 之类的 : 由于输入的是int, 这种值实际被传入时已经变成了555, 323, 所以其实可以不用考虑.
- 溢出 : 可以这么想, 如果能作为int输入, 那么如果是palindrome, 那么reverse是不会溢出的, 所以一旦溢出就不用算了, 这绝对不是palindrome.
提交
一次AC
代码
public class Solution {
public boolean isPalindrome(int x) {
return reverse(x) == x;
}
private int reverse(int x){
int re = 0;
while (x > 0){
int remainder = x % 10;
x = x / 10;
int temp = re * 10 + remainder;
if((temp - remainder) / 10 != re){
// overflow
return 0;
}
re = temp;
}
return re;
}
}
最佳实现
确实有更好的实现思路, 大概可以再省一半的时间, 原理在于它只计算一半, 如果是回文数, 在reverse过程中原数不断变小, reverse数不断变大, 此时在reverse数变大到将要超过原数的时候, 如果是回文数, 这两个值显然是相等的, 所以可以利用这一特征, 只计算一半, 这应该算是最好的解法了 :
public boolean isPalindrome(int x) {
if (x<0 || (x!=0 && x%10==0)) return false;
int rev = 0;
while (x>rev){
rev = rev*10 + x%10;
x = x/10;
}
return (x==rev || x==rev/10);
}