回文数判定中的收获

回文数判定

问题描述

   判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

说明

   这篇文章仅仅记录自己的收获,在刷题路上遇到的新思路总是能给你惊喜。世界这么大,多看看眼界会开阔很多,学习也一样,多看看他人的解题思路,自己的眼界也会开阔很多。就像这次的回文数判定,原来拿到题目就是解完就算了,也不管时间复杂度,反正通过就完事了。前天第一次在leetcode上提交了自己的第一个粗糙的答案,顺手看了看了他人题解后,果然世界美好无比,我瞬间就爱上了这个网站,但我相信我们的邂逅并不晚,这是一种非常棒的感觉,妙不可言。

解题思路

思路一:

  把得到的整数转化为字符串,然后转化成字符数组,接着首位置换字符数组,再把字符数组重新转化为字符串,然后两个字符串equals一次,得出的结果就是回文数的判定结果。

思路一代码:

 public static boolean isPalindrome01(int x) {
		 //代码很简单就不写注释了
        String s1 = String.valueOf(x);
        char[] chars = s1.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            chars[i] = chars[chars.length - i - 1];
        }
        String s2 = String.valueOf(chars);
        return (s1.equals(s2));
    }
思路二:

  如果一个数是回文数,那么这个数肯定是对称的,那么就不用考虑整个数字,只要将其前一半的数字或后一半的数字反转,然后跟另一半对比就行了。(就像要搬十块砖,现在包工头突然说只要搬一半就可以了是不是很开心)。现在的问题就是1.取反 2.判定取了一半的数字时停止取反。我们这里采用取余的方式获得给定数值的最后一位数,如: 121 % 10 = 1 ,然后在下一次取余时,先将原数字 “/10” 后再取余,当获得倒数第二位数时,将获得的第一位数 10 然后加上倒数第二位数
如:121 / 10 = 12;12%10=2;1
10+2=12;
接下去皆是如此,直到取了一半的数。现在的问题就是判定何时到了一半的值,此时就可以把我们新的出的值用起来了,将它和不断/10的值做对比,当不断 “/10” 后的原始数字小于或等于反转后的数字时,就意味着我们已经处理了一半位数的数字了。
  这里还有一个问题,我们需要判断原始数字的奇偶性,当原始数字的位数是偶数时,如1221,我们最后取反得到的数字应该是12,原始数字不断/10后应该也会变成12,所以这两个数字直接对比就可以得出结果。但是当原始数字的位数是奇数时,如12321,我们最后取到数字应该是123,而原始数字应该已经变成了12,这时直接对比显然是不妥当的,所以要将最后取到的数字123做 “/10” 操作,因为奇数位的回文数,它中间的那一位是无关紧要的。将123/10变成12后,就可以像偶数回文数那样直接对比了。

思路二代码:

    public static boolean isPalindrome02(int x) {
        //首先判断x是否小于0,或者x最后一位数是0但是首位不是0
        if (x < 0 || (x % 10 == 0 && x != 0))
            return false;

        //revertedNum为反转后的数字
        int revertedNum = 0;

        while (x > revertedNum) {
            //每循环一次,revertedNum增加一位数,x减少一位数,直到反转的数字大于原数字
            revertedNum = revertedNum * 10 + x % 10;
            x /= 10;
        }
        //若x为偶数,且到最中间位才有差异,则要么不等,要么位数相差两位
        //例如:x = 121221  -> revertedNum = 121 , x = 122
        //x = 122121  -> reveredNum = 1212 , x = 12
        //若x为奇数,则使用x == revertedNum /10 判断
        //因为revertedNum最后会超过x一位。
        return x == revertedNum || x == revertedNum /10;
    }

我只是一个小萌新,如果各路大神有更简单更有效的思路,还恳请不吝赐教。

猜你喜欢

转载自blog.csdn.net/TreeCode/article/details/106700099