LeetCode刷题记录(二十六):回文数

162 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第26天,点击查看活动详情

回文数

image.png

题目解析

题目素材解析

根据题目中的描述来看,提供的素材是一个整数。

  1. 一个整数x;没有别的注意事项。

我的解读

首先题目给出了一个回文数的概念:正序和倒序数值一样,也就是说一个整数,反过来之后与原来的数字依然相同。

例如,1999的倒序是9991,很明显不是回文数。1991的倒序是1991,很明显这个就是回文数。

从这道题出发,难点就在于如何获取数字每一位的数字。

至于如何获取到数字的每一位数字,方式很多,比如转换成字符串进行截取,通过除以10来保留每一位的数字都可以。

解题思路

解题思路也是遵循着获取数字的每一位数字为前导。

第一步,获取数组的每一位数字,放置到List集合中。这里我用的是除以10的方式,每次除以10后取余值保存下来。

第二步,因为要判断倒序是否一样,所以需要首尾相对比,利用一前一后的元素进行对比,只要有一个不相等就证明不是回文数。

更具体的看一下代码吧。

代码

class Solution {
    public boolean isPalindrome(int x) {
        if(x == 0){
            return true;
        }
        if(x < 0 || x % 10 == 0){
            return false;
        }
        List<Integer> numList = getIntList(x);
        int n = numList.size();
        n = n % 2 == 0 ? n : n - 1;
        int l = 1, r = 1;
        boolean flag = true;
        while(l + r <= n){
            int lz = numList.get(l-1);
            int nz = numList.get(numList.size() - r);
            if(lz != nz){
                flag = false;
                break;
            }else{
                l++;
                r++;
            }
        }
        return flag;
    }

    private List<Integer> getIntList(int x){
        List<Integer> list = new ArrayList<Integer>();
        while (x != 0){
            list.add(x % 10);
            x = x / 10;
        }
        return list;
    }

}

执行结果

聊着天刷什么题都不行,搞得思路都错了,一下子提交错了好多次。

image.png

换一种方法

想了想,其实在将每一个值获取出来的过程中,直接生成一个倒序数值即可。最后再与初始值进行比对。

通过循环来将每一个数值进行拼接,随后获得一个倒序数值,进行比较即可。

代码如下:

class Solution {

    public boolean isPalindrome(int x) {
        if(x == 0){
            return true;
        }
        if(x < 0 || x % 10 == 0){
            return false;
        }
        int result = 0;
        int ten = getIntTen(x);
        int n = x;
        while (ten > 0){
            result = result + n % 10 * ten;
            n = n / 10;
            ten = ten / 10;
        }
        return x == result;
    }

    private int getIntTen(int x){
        int n = 1;
        while (x >= 10){
            n = n * 10;
            x = x / 10;
        }
        return n;
    }

}

速度稍快了一些,但是内存又稍多一些,看了看还有优化的空间。

image.png

Java代码本地执行

Java本地可调试代码,请参考github/Ijiran,可通过索引看到相应代码。

如下图所示:

image.png