LeetCode-回文数

127 阅读1分钟

这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

题目

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。

 

  • 示例 1:

输入:x = 121 输出:true

  • 示例 2:

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

  • 示例 3:

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

  • 示例 4:

输入:x = -101 输出:false  

提示:

-231 <= x <= 231 - 1

思路:

把回文数边界值外的输入值先排除

当输入值为负数时,则必定不是回文数,因为当一个整数为负数时,首位为负号(-),但是末位(个位数)不可能为负号(-) 当输入值的末位数为零时,也可能不是回文数,自然数(自然数属于整数)中,最小的回文数是0,若输入值为非零整数且末位数(个位数)为0,则必定不是回文数

image.png

做法一

(简单实现版)把该题看做上一个题目LeetCode-整数反转的拓展, 那么就是把整数反转后直接判断是否与输入值一致就能够出结果了,由于这里没有要求不允许存储 64 位整数,为了避免整数反转的结果溢出32位数,我们直接用一个大箱子(long类型)来装反转的数

实现
    public boolean isPalindrome(int x) {
        long y = 0;
        long i = x;
        while (x>0){
            y = y*10 + x%10;
            x /= 10;
        }
        return i == y;
    }
}
做法二

(性能优化版)利用回文数的规律

回文数,顾名思义,就是左右两边相等,我们实现的思路依旧是整数反转的思路,但是,既然是回文数,那么我们可以反转一半的时候进行比较,当然,会有两种情况 输入值中数字个数是偶数个的时候,反转一半时,两边相等就可以判定为回文数 输入值中数字个数是奇数个的时候,刚刚反转一半多一个数的时候,判断左边比右边(进行/10操作,去掉个位数)相等也能判定为回文数

实现
    public boolean isPalindrome(int x) {
        if (x < 0 || (x != 0 && x %10==0)){
            return false;
        }
        int y = 0;
        while (x > y){
            y = y*10 + x%10;
            x /= 10;
        }
        return x == y || x == y/10;
    }
}