#9_回文数

Category Difficulty Likes Dislikes
algorithms Easy (57.25%) 977 -

我的答案

public boolean isPalindrome(int x) {
    // 解一: 转成字符串
    // String s = String.valueOf(x);
    // int length = s.length()-1;
    // for(int i=0; i<s.length()/2; i++){
    //     if(s.charAt(i) != s.charAt(length)){
    //         return false;
    //     }
    //     length--;
    // }
    // return true;

    // 解二
    if(x<0){
        return false;
    }
    int len = 1;
    while(x/len >= 10){
        len*=10;
    }
    while(x != 0){
        if(x%10 != x/len){
            return false;
        }
        x%=len;
        x/=10;
        len/=100;                
    }
    return true;
}

解题思路

解一

  • 转成字符串判断,这是简单的

解二

  • 取最高位和最低位比较,比完掐头去尾继续比
  • 最低位用 x % 10 取
  • 最高位,先算出位数 len,再用 x % len 取
  • 注意,掐头去尾后,len 变化是 102

答案分析

参考方案

  • 首先,负数和末尾为零(除 0 外)不可能是回文
  • 如果是回文,把它的后半部分反转,肯定等于前半部分
  • 因为前半部分一直在除以十,而半部分一直在乘以十,所以当后半部分大于前半部分时,说明反转到一半了
  • 如果最后得到的 right 为奇数位,比如 123,那把最后一位去掉就行
public boolean isPalindrome(int x) {
    if(x < 0 || (x % 10 == 0 && x != 0)){
        return false;
    }
    int right = 0;
    while(x > right){
        right = right * 10 + x % 10;
        x/=10;
    }
    return x == right || x == right / 10;
}

时间复杂度 O(log10n)

空间复杂度 O(1)

备注



猜你喜欢

转载自www.cnblogs.com/mdz3201/p/leetcode_9.html