leetcode9 -- 回文数

题目描述:

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false

回文数

是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

  • 例如,121 是回文,而 123 不是。

示例 1:

复制代码
输入:x = 121
输出:true

示例 2:

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

示例 3:

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

提示:

  • -231 <= x <= 231 - 1

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

解法:

方法一、整数转字符串,头尾向内侧遍历比较

这个方法很容易想到,也比较简单。

1.通过Integer.toString()方法将整数转换为字符串,将其拆分为一个一个的字符。

2.去除空格并考虑特殊情况,比如如果开头有符号'-',那整数结尾不可能也是'-',所以一旦有符号那一定不可能是回文数,返回false。

3.对字符串头尾向内侧遍历,只要有一个不一致就返回false,如果全一致则返回true

代码:

复制代码
class Solution {
        public boolean isPalindrome(int x) {
        String s=Integer.toString(x);
        s=s.trim();
        if(s.isEmpty()){
            return false;
        }
        if(s.charAt(0)=='-' || s.charAt(0)== '+'){
            return false;
        }
        int center=s.length()/2;
        for(int i=0,j=s.length()-1;i<=center && j>=center;i++,j--){
            if(s.charAt(i)!=s.charAt(j)){
                return false;
            }
        }
        return true;
    }
}

方法二、整数通过余数和除法翻转比较

第二个方法是将数字的后一半进行翻转,然后与前一半进行比较。

比如:"123321",将后三位进行翻转为"123",再与前一半比较,二者相同,则"123321"是回文。

比如:"12321",是奇数位数字,将后三位翻转为"123",与前两位"12"进行比较,"12"="123/10",前面一半等于后面一半除以10,则"12321"是回文。

那么如何翻转?

利用余数和除法。

对于12321,其对10取模,得到末尾数字1,对其除以10,把最后一位从数字中移除,得到其余位"1232",继续让该数字对10取模,得到次末尾数字2,那么反转后的数字成了1*10+2=12,再对其除以10,则到"123",循环直到反转后的数字等于前一半数字,或者反转后的数字除以10等于前一半数字,即为回文,否则不是回文。

当然,要先考虑特殊情况,比如如果是负数,带有符号'-',那一定不是回文,直接返回false,如果数字本身不是0,但最后一位是0,数字的第一位不是0,那也一定不是回文,可直接返回false。

代码:

复制代码
class Solution {
        public boolean isPalindrome(int x) {
        if (x < 0) {
            return false;
        } else if (x % 10 == 0 && x > 0) {
            return false;
        } else if (x == 0) {
            return true;
        } else {
            int num = 0;// 存储翻转过来的数字
            while (x != 0) {
                int yu = x % 10;// 获得余数,也就是从右向左每一位
                num = num * 10 + yu;// 翻转的数字
                x /= 10;// x/10
                if (num >= x) {
                    // 已经到达或过了中心点
                    if (num == x || num / 10 == x) {
                        return true;
                    }
                    return false;
                }
            }
            return false;
        }
    }
}
相关推荐
lancyu38 分钟前
C语言--插入排序
c语言·算法·排序算法
点云SLAM39 分钟前
C++20新增内容
c++·算法·c++20·c++ 标准库
独好紫罗兰1 小时前
洛谷题单3-P1217 [USACO1.5] 回文质数 Prime Palindromes-python-流程图重构
开发语言·python·算法
独好紫罗兰1 小时前
洛谷题单2-P1424 小鱼的航程(改进版)-python-流程图重构
开发语言·python·算法
qystca2 小时前
蓝桥云客---九宫幻方
算法·深度优先·图论
明月清了个风3 小时前
数据结构与算法学习笔记----贪心区间问题
笔记·学习·算法·贪心算法
努力毕业的小土博^_^3 小时前
【EI/Scopus双检索】2025年4月光电信息、传感云、边缘计算、光学成像、物联网、智慧城市、新材料国际学术盛宴来袭!
人工智能·神经网络·物联网·算法·智慧城市·边缘计算
神里流~霜灭3 小时前
数据结构:二叉树(三)·(重点)
c语言·数据结构·c++·算法·二叉树·红黑树·完全二叉树
网安秘谈3 小时前
非对称加密技术深度解析:从数学基础到工程实践
算法
luckyme_3 小时前
leetcode-代码随想录-哈希表-有效的字母异位词
算法·leetcode·散列表