【算法题解】LeetCode 9.回文数

题目

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
进阶:
你能不将整数转为字符串来解决这个问题吗?

解法一

转换为字符串判断是否为回文字符串。

class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0) {
            return false;
        }
        String str = String.valueOf(x);
        int length = str.length();
        for(int i = 0; i < length / 2; i++) {
            if(str.charAt(i) != str.charAt(length - 1 - i)) {
                return false;
            }
        }
        return true;
    }
}

解法二

分解出数字的每一位,转换为数组再进行判断

class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0) {
            return false;
        }
        int[] digit = new int[10];
        int i = 0;
        while(x > 0) {
            digit[i++] = x % 10;
            x = x / 10;
        }
        for(int j = 0; j < i / 2; j++) {
            if(digit[j] != digit[i - 1 - j]) {
                return false;
            }
        }
        return true;
    }
}

解法三 只反转一半数字进行比较

前两种方法一是使用了转换字符串,二使用了额外数组。其实还有一种更好的解法。我们可以只对数字的后一半位数进行反转,反转后如果和前一半保持一致则说明是回文数字。

众所周知,可以使用除10取余数+除10的方式来获取最后一位数字。那么我们如何判断已经转换了一半的位数呢?其实在转换的过程中,结果数字是在不断变大的,原数字却在不断变小。当原数字小于等于结果数字时说明转换了一半\或一半加1个(位数位奇数的情况)。

另外需要注意的是,上述求反转数字的过程。对于10的倍数是不必要(10的倍数除了0都不是回文数字),且在最后一步进行位数位奇数的特殊处理时容易出错。所以可以将10的倍数和负数一样作为特殊情况进行处理。

class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0 || (x % 10 == 0 && x != 0)) {
            return false;
        }

        int revert = 0;
        while(x > revert) {
            revert = revert * 10 + x % 10;
            x = x / 10;
        }

        return (revert == x) || (revert / 10 == x);
    }
}

猜你喜欢

转载自blog.csdn.net/vxzhg/article/details/106673516