前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 进阶之路 - 回文数

LeetCode 进阶之路 - 回文数

作者头像
Li_XiaoJin
发布2022-06-10 19:15:55
2010
发布2022-06-10 19:15:55
举报
文章被收录于专栏:Lixj's BlogLixj's Blog

题目描述

代码语言: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%10;
            x /= 10;
        }

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-01-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 解法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档