思路

这道题, 一下就能联想到第7题, 因为回文数不就是倒过来和自己相等吗? 那么我们reverse输入, 对比原输入即可.

实现

个人考虑了如下corner case :

  1. 负数 : 一律不是
  2. 0555, +323 之类的 : 由于输入的是int, 这种值实际被传入时已经变成了555, 323, 所以其实可以不用考虑.
  3. 溢出 : 可以这么想, 如果能作为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);
}
posted on 2016-12-28 17:18  内脏坏了  阅读(135)  评论(0编辑  收藏  举报