Java-回文数-20190420

0.题目要求

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:输入: 121 输出: true
示例 2: 输入: -121 输出: false;解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3: 输入: 10 输出: false;解释: 从右向左读, 为 01 。因此它不是一个回文数。

1.我的解法

最开始的思路比较简单:就是将数字反转,对比原数字是否相等
同时未处理其中的溢出问题,因此Java的溢出不会报错,而一旦溢出也就说明它不是回文数,因此不影响反转对比的判断。尽管不影响结果,但这样是不好的。

public static boolean isPalindrome(int x) {
        if(x<0) {
            return false;
        }else{
            int rev = 0;
            int temp_x = x;
            while(temp_x%10>=0&&temp_x!=0){
                int pop = temp_x%10;
                rev=rev*10+pop;
                temp_x/=10;
            }
            if(rev==x){
                return true;
            }
        }
        return false;
    }

我的解法
其实结果还不错。

2.官方解法

其实回文数只需要倒序取出到一半就能够验证了,比如:

1221,只需要取出后两位12,对比前两位12即可;
45354,只需要取出45,然后和45对比即可;

但是面临一个问题,就是如何确定已经取到了一半呢?
方法就是:在倒序的while’循环过程中,反转数字rev=rev*10+pop并且x=x/10之后,若原数字x小于等于rev,就说明已经取出到一半了。同样的,拿上面的例子:

1221,取出rev=12之后,x=122/10==12,已经等于rev,循环就退出即可;
45354,取出rev=453之后,x=453/10==45,已经小于rev,循环也退出;

换几个非回文数字:

12345,取出rev=453之后,123/10==12,已经小于rev,循环退出;
54321,取出rev=123之后,543/10==54,已经小于rev,循环退出;
6789,取出rev=98之后,678/10==67,小于rev,循环退出;
9854,取出rev=458之后,98/10==9,小于rev,循环退出;

基于上面这些情况,只需要返回rev==x||rev/10==x,非回文都会返回false,回文都会返回true,不信可以一一比对。
大功告成了吗?
其实没有,比如10,这个数,其实不是回文,但是用上面的方法,
rev=0,x=10/10== 1; rev=1, x=1/10 == 0;此时x小于rev返回rev/10==x其实是相等的;
为了解决这个问题,在边界上,数字为负数直接返回false,数字末尾为0且数字自身不为0直接返回false

public static boolean isPalindrome(int x) {
        if(x<0) {
            return false;
        }else{
            int rev = 0;
            //当已经反转的内容>=x/10的时候,说明已经反转到一半的位置了
            while(rev<x){
                int pop = x%10;
                rev = rev*10+pop;
                x/=10;
            }
            //如果已经反转的内容与x/10相等,说明数字为偶数长度的回文数字
            //如果已经反转的内容/10和x/10相等,说明数字为奇数长度的回文数字
            return x==rev||x==rev/10;
        }
    }

在这里插入图片描述
效果稍微更好一点。时间复杂度方面O(log10(x)/2),空间复杂度O(1)。

猜你喜欢

转载自blog.csdn.net/qq_32760017/article/details/89425528
今日推荐