算法的实战(四):LeetCode -- Palindrome Number

一 题目描述

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

示例 1:

输入: 121
输出: true

示例 2:

输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:

输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。

进阶:

你能不将整数转为字符串来解决这个问题吗?

二 解题思路

1.这道题我们第一时间可以联想到我们上一道题-反转数,只要反转数跟原来的数一样就返回true即可

2.但其中有一些可以优化的点:a.只要为负数的,都应该直接返回false; b.只要小于10 的正整数,都应该直接返回true,这样可以省掉很多计算和比较次数,但最坏的情况可能会导致比较次数增多(测试的用列如果都是大于10的整数,两个前提都会多增加两次的比较)

三 代码实战

public static int reverse (int x) {
        int reverse = 0;
        while (x!=0){
            reverse = reverse * 10 + x % 10;
            x/=10;
        }
        if(reverse>Integer.MAX_VALUE||reverse<Integer.MIN_VALUE){
            return 0;
        }

        return reverse;
    }

    public static boolean isPalindrome (int x){
        if(x<0){
            return false;
        }
        if(x<10){
            return true;
        }
        if(x==reverse(x)){
            return true;
        }
        return false;
    }

四  扩展点

用反转的方法再优化最好的时间复杂度为O(n)(除了两个特例(负数和小于10)的时间复杂度为O(1))(因为你得遍历整数的位数)

但还有一种更加有优化空间的是用string来代替num类型的方法(但本题建议是不将它转换成字符串来解决,故不用此方法)

扫描二维码关注公众号,回复: 3483822 查看本文章

解题思路还是我之前的二分法思想,遍历该数的一半长度,每一次把相对称的元素进行对比,只要不相同则直接返回false,时间复杂度为O(n/2),代码实例如下:

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

        return true;
    }

猜你喜欢

转载自blog.csdn.net/m0_38082440/article/details/82917499