【LeetCode09】

130 阅读1分钟

Leetcode第九题,回文数

自己写的代码十分丑陋:

public static boolean isPalindrome(int x){
    if(x<0) return false;
    if(Integer.toString(x).length()==0) return true;
    else{
        String strx = Integer.toString(x);
        double half = (strx.length()+1.0)/2.0-1.0;
        int i =0, j=strx.length()-1;
        while(i<half && j>half){
            if(strx.charAt(i)!=strx.charAt(j)) return false;
            else{
                i++;
                j--;
            }
        }
    }
    return true;

}

题解给的思路清晰,代码简洁,我认为这里面最值得熟练掌握的是这个简洁高效的得到逆序数字的方法:

x为原数字,rev为逆序数字:

rev = 0;
while(x!=0){
    rev = rev*10 + x%10;
    x/=10;
}

这是我没有掌握的,x%10得到末尾数字,x/=10删掉最后一位,在本题中不需要完全逆序,主要是害怕逆序后的溢出,所以只翻转了一半。并通过很巧妙的方法忽略了中间的数字。

写一下代码:

 public static boolean isPalindrome(int x){
    if(x < 0 || (x%10 ==0 && x!=0)) return false;
    //负数不是回文数,如果以0结尾也不是回文数,因为这意味着开头也是0,只有0本身能做到
    
    int rev = 0;//后一半数的逆序
    while(x>rev){
        rev = rev*10+x%10;
        x/=10;
    }
    return (rev==x || rev/10 ==x);
    //如果x长度是奇数那么rev会比x前一半多一位,用rev/10删除这一位(即是rev此时最后一位)判断
}