LeetCode 进阶之路 - 回文数

2022-06-10 19:15:55 浏览数 (1)

题目描述

代码语言:javascript复制
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:

输入: 121
输出: true
示例 2:

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法

这个解法是参考上一题的思路,先判断整数是否是小于0或者是末位是0的情况,是的话直接返回false。然后对整数进行反转,如果反转后的整数等于原来的数,则是回文数。

代码语言:javascript复制
public boolean isPalindrome(int x) {
        int rev = 0;
        int a = x;
        if (x < 0 || (x % 10 == 0 && x != 0)) {
            return false;
        }
        while (x != 0) {
            int pop = x % 10;
            x /= 10;
            if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE/10 && pop > 7)) {
                return false;
            }
            if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE/10 && pop > -8)) {
                return false;
            }
            rev = rev * 10   pop;
        }

        return rev == a ? true : false;
    }

用上面的方法会存在溢出的问题,官方的方法是只反转一半,然后判断两个部分是否相等。

这个方法则更加巧妙一些,不会出现溢出的情况,代码也更加简洁、优美。

如下:

代码语言:javascript复制
public static boolean isPalindrome2(int x) {
        if (x < 0 || (x % 10 == 0 && x != 0)) {
            return false;
        }
        int rev = 0;
        while (x > rev) {
            rev = rev * 10   x;
            x /= 10;
        }

        // 长度为奇数||前面,长度为偶数||后面
        return x == rev || x == rev/10;
    }

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可 Links: https://lixj.fun/archives/leetcode进阶之路-回文数

ode

0 人点赞