美文网首页
9.回文数

9.回文数

作者: 第四单元 | 来源:发表于2020-06-06 16:53 被阅读0次

    题目

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

    解法一

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

    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);
        }
    }
    

    相关文章

      网友评论

          本文标题:9.回文数

          本文链接:https://www.haomeiwen.com/subject/jmnxtktx.html