回文数

165 阅读2分钟

leetcode 回文数

这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

一个方法就是先将整数转为字符串,然后逐个比较字符串一头一尾的字符是否相等,如果遇到不相等的,那么这个数字就绝对不是回文数了,对于数字个数奇偶个的问题也不影响,如果是奇数个数的就只需比较最中间字符两边的数字,偶数的话需要比较对半分两边所以的数字。对于一些特殊的数字,例如负数,小于0的负数就对不是回文数,因为它带了一个负号,一个整数最后面不可以也有负号;还有除了0本身以外的最右边的数字为0的也不可能是回文数;还有一些个位数那就可以直接返回true。

public boolean isPalindrome(int x) {
    // 小于0的负数绝对不是回文数
    if (x < 0 || (x % 10 == 0 && x != 0)) {
        return false;
    }
    // 个位数指定就是回文数
    if (x <= 9) {
        return true;
    }
    // 转成字符串
    String temp = x + "";
    int len = temp.length();
    for (int i = 0; i < len / 2; i++) {
        // 如果字符串头尾字符不相等 那就不是回文串
        if (temp.charAt(i) != temp.charAt(len - 1 - i)) {
            return false;
        }
    }
    return true;
}

同样我们可以讲整个整数反转过来,最后比较一下反转的整数和原本的整数是否相等就可以了。可以顺便利用之前写的整数反转的代码。同时也可以对一些特殊数字预先处理。

public boolean isPalindrome111(int x) {
    // 小于0的负数绝对不是回文数
    if (x < 0 || (x % 10 == 0 && x != 0)) {
        return false;
    }
    // 个位数指定就是回文数
    if (x <= 9) {
        return true;
    }

    // 将数字反转 然后与原数比较
    return x == reverse(x);
}

public int reverse(int x) {
    // 返回值
    long res = 0L;
    // 循环每次取掉x的最后一位数,直到取完为0,正负数取完最后都会为0
    while (x != 0) {
        // 把x的最后一位取来 放到返回值的后面
        // res*10 往后面加一位,x%10 取模再加上x取出的最后一位数
        res = res * 10 + x % 10;
        // 截掉x的最后一位数
        x /= 10;
    }
    // 如果超过int的范围 直接返回0
    if (res < Integer.MIN_VALUE || Integer.MAX_VALUE < res) {
        return 0;
    }
    return (int) res;
}