LeetCode刷题之旅(简单-3):回文数

力扣算法网: 回文数 字符串反转法:代码简洁,易于理解,适合快速实现。数学反转法:空间效率更高(( O(1) )),更适合对空间要求严格的场景。在实际开发中,可根据需求选择方法。若追求代码可读性,选字符串法;若追求性能,选数学法。 阅读详情

2019年4月30日

目录

题目

解决方法一:暴力拆解数字,与输入数作比较

性能结果:

解决方法二:优化解法

思路分析:

算法:

复杂度分析:

解决方法三:中间指针靠拢

思路:

小结:


题目

 

解决方法一:暴力拆解数字,与输入数作比较


public class PalindromeNumber {
    public static boolean isPalindrome(int x) {

        // 1.负数 false
        boolean symbol = false;
        if (x < 0){
            return symbol;
        }

        // 2.正数
        int tmp = x;
        ArrayList<Integer> nums = new ArrayList<>();
        while (tmp > 0){
            if (tmp % 10 >= 0){
                nums.add(tmp % 10);//最低位靠前
            }
            tmp = tmp /10;
        }

        // 3.是否回文
        double result = 0.0;
        for(int i=0;i<nums.size();i++){
             result += (nums.get(i)*Math.pow(10,nums.size()-i-1));
        }

        symbol = ((result - x == 0))?true:false;
        return symbol;
    }

    public static void main(String[] args){
        int a = 10;
        boolean result = isPalindrome(a);
        System.out.println("result="+result);
    }
}

性能结果:

 

解决方法二:优化解法

class Solution {
    public boolean isPalindrome(int x) {
        
        if(x<10&&x>=0)return true;

        char[] chars = String.valueOf(x).toCharArray();

        int left=0;
        int right=chars.length-1;
        
        while (left<right){

            if(chars[left]==chars[right]){
                left++;
                right--;
            }else return false;

        }
        return true;

    }
}

思路分析:

方法:反转一半数字

映入脑海的第一个想法是将数字转换为字符串,并检查字符串是否为回文。但是,这需要额外的非常量空间来创建问题描述中所不允许的字符串。

第二个想法是将数字本身反转,然后将反转后的数字与原始数字进行比较,如果它们是相同的,那么这个数字就是回文。 但是,如果反转后的数字大于 \text{int.MAX}int.MAX,我们将遇到整数溢出问题。

按照第二个想法,为了避免数字反转可能导致的溢出问题,为什么不考虑只反转 \text{int}int 数字的一半?毕竟,如果该数字是回文,其后半部分反转后应该与原始数字的前半部分相同。

例如,输入 1221,我们可以将数字“1221”的后半部分从“21”反转为“12”,并将其与前半部分“12”进行比较,因为二者相同,我们得知数字 1221 是回文。

让我们看看如何将这个想法转化为一个算法。

算法:

首先,我们应该处理一些临界情况。所有负数都不可能是回文,例如:-123 不是回文,因为 - 不等于 3。所以我们可以对所有负数返回 false。

现在,让我们来考虑如何反转后半部分的数字。 对于数字 1221,如果执行 1221 % 10,我们将得到最后一位数字 1,要得到倒数第二位数字,我们可以先通过除以 10 把最后一位数字从 1221 中移除,1221 / 10 = 122,再求出上一步结果除以10的余数,122 % 10 = 2,就可以得到倒数第二位数字。如果我们把最后一位数字乘以10,再加上倒数第二位数字,1 * 10 + 2 = 12,就得到了我们想要的反转后的数字。 如果继续这个过程,我们将得到更多位数的反转数字。

现在的问题是,我们如何知道反转数字的位数已经达到原始数字位数的一半?

我们将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于反转后的数字时,就意味着我们已经处理了一半位数的数字。

 

复杂度分析:

  • 时间复杂度:O(\log_{10}(n))O(log10​(n)), 对于每次迭代,我们会将输入除以10,因此时间复杂度为 O(\log_{10}(n))O(log10​(n))。
  • 空间复杂度:O(1)O(1)。

 

解决方法三:中间指针靠拢

class Solution {

   public boolean isPalindrome(int x) {
        if(x < 0){
            return false;
        }
        if(x < 10){
            return true;
        }

        //首先获取整数位数
        int numCount = getNumCount(x);
       //前面的数字索引
        int firstIndex = 1;
       //后面的数字索引
        int lastIndex = numCount;

        while (firstIndex<=lastIndex){
            int firstNum = getIndexNum(x,firstIndex,numCount);
            int lastNum = getIndexNum(x,lastIndex,numCount);
            if(firstNum != lastNum ){
                return false;
            }
            firstIndex++;
            lastIndex--;
        }

        return true;
    }

    /**
    * 获取整数中的第几位数字
    */
    private int getIndexNum(int value,int index,int numCount){
        int chushu = (int) Math.pow(10,numCount-index);
        return (value/chushu)%10;
    }


    /**
    *获取整数位数
    */
    private int getNumCount(int value){
        int count = 1;
        int firstNum = value;
        while(firstNum >= 10){
            firstNum = firstNum/10;
            count ++;
        }
        return count;

    }
}

思路:

声明收尾两个指针,每次比较首尾得到的数字,如果首尾数字相同,则首指针往后移,尾指针往前移。 继续对比下一个数字。直到指针到达中间。

 

小结:

算法是程序的灵魂与核心,写一手好代码真的很重要。

LeetCode 第9题:回文数 通过这个题目,我们不仅学习了如何判断一个数是否是回文数,还探讨了两种不同的解题方法:直接转换为字符串法和反转一半数字法。通过这些方法,我们可以在不同情况下灵活应对,保证高效、正确地解决问题。思路是这样的: 1. 特殊情况处理:负数一定不是回文数;以0结尾的数字(除非是0本身)也不可能是回文数。2. 反转一半的数字:将数字的后半部分反转,然后与前半部分进行比较。 阅读详情

相关推荐

SPL06气压温度传感器SPI驱动与补偿算法详解

气压传感器与温度传感器是嵌入式环境感知系统的核心组件,其测量精度高度依赖于MEMS芯片的校准参数与非线性补偿机制。SPL06作为集成式高精度数字传感器,采用24位Σ-Δ ADC与片内补偿引擎,需结合唯一出厂校准系数(即‘芯片指纹’)进行多阶数学修正,才能将原始ADC值转化为符合计量要求的帕斯卡(Pa)与摄氏度(℃)物理量。该过程涵盖SPI通信协议解析、寄存器时序控制、大端数据拼接、二进制补码处理及浮点/定点混合运算等典型嵌入式工程实践。广泛应用于无人机高度计、智能穿戴海拔监测与IoT气象终端中。

weixin_34640289的博客 143

统计任意字符串中回文字符串的个数

题目来源: 庞果英雄会   题目详情: 回文字符串是指从左到右和从右到左相同的字符串,现给定一个仅由小写字母组成的字符串,你可以把它的字母重新排列,以形成不同的回文字符串。 输入:非空仅由小写字母组成的字符串,长度不超过100; 输出:能组成的所有回文串的个数(因为结果可能非常大,输出对1000000007取余数的结果)。 例如:输入"aabb" 输出为2(因为“aabb”对应的所有回文字

XIAXIA__的专栏 5915

【yolov8】与yolov5的区别及改进详解

yolov8-----有点厉害的目标检测框架.

qq_44878985的博客 3万+

给定一个数字,怎么判断它是不是回文形式的?

给定一个数字,例如:1234554321,怎么才能判断这个数是不是回文呢?要求时间复杂度是O(n),空间复杂度是O(1).约定负数和0都不是回文。 如果要求不是空间复杂度是O(1),那可以直接把数字转换成字符串,用sprintf函数,然后判断这个字符串是不是回文。 第一种思路就是把这个数字,比如123321进行反转,然后把反转后的结果和原来的数字进行比较,如果相等那么就说明是这个数字是回文形式

zzran的专栏 5498

ADS2023实战:2.4GHz超外差接收机从设计到链路预算全流程解析

本文以ADS 2023软件为平台,详细解析了2.4GHz超外差接收机从核心指标定义、架构原理到完整链路搭建与仿真的全流程。通过实战演练,重点阐述了如何利用ADS进行谐波平衡仿真和链路预算分析,以量化评估系统增益、噪声系数等关键性能,为射频工程师提供了一套从理论到仿真的系统级设计方法。

herb5的博客 817

开箱即用的Platform IO开发平台(包括Arduino,ESP8266,ESP32,STM32)

开箱即用的 Platform IO 离线开发环境,包含(ESP32,ESP32S2,ESP8266,Arduino,STM32)

qq_19703307的博客 755

LeetCode刷题之旅

LeetCode刷题之旅 一、链表 1.链表逆序(leetcode 206.Reverse Linked List)esay 题目描述:已知链表头节点指针head,将链表逆序。 思路:从链表的头节点依次遍历,每遍历一个节点就进行逆序, 使用头插法进行逆序。O(n) 代码实现: /** * Definition for singly-linked list. * public class Lis...

Wangz的博客 385

Zephyr OS实战指南:从入门到精通物联网开发

本文提供了一份详尽的Zephyr OS实战指南,涵盖从开发环境搭建到物联网应用开发的全过程。文章详细介绍了如何利用Zephyr OS进行线程管理、设备驱动开发、低功耗设计以及蓝牙通信,并通过具体代码示例帮助开发者快速掌握这一专为物联网设备设计的开源实时操作系统,实现从入门到精通的跨越。

weixin_29201933的博客 546

9.统计回文数

“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有 对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符 串B插入字符串A使产生的字符串是一个回文串。你接受花花的请求,帮助她寻找有多少种插入办法可以使新 串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。

qq_44835589的博客 527

WRF进阶:定制Vtable文件解析非标准气象数据源——以ERA5-Land土壤湿度为例

本文详细介绍了如何为WRF模式定制Vtable文件,以解析非标准气象数据源ERA5-Land的土壤湿度数据。通过剖析GRIB文件结构、详解Vtable编写逻辑与语法,并提供了从数据验证到metgrid配置的完整实战流程,帮助用户突破标准数据源限制,实现高精度陆面过程模拟。

o4p5q6r7s的博客 391

MISRA C 详解 · 专栏06:2023 与 2025 更新总览(相对 2012 的差异)

本专栏 01~05 篇基于(143 规则 + 16 指令)。这六年间标准又前进了两步——(大改)和(微调)。本文补充说明「相对 2012,标准变在哪」,并给出新增规范的代表性示例。

XavierKong的博客 73

python_蓝桥杯测试赛_真题_回文数

python_回文数

weixin_46710559的博客 1519

【WRF后处理】基于wrf-python处理wrf运行结果wrfout_d01

基于wrf-python处理wrf运行结果wrfout_d01

WW、forever的博客 5209

力扣刷题之旅——9.回文数

力扣简单题?这也太难了吧。

C语言入门 2060

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

力扣(LeetCode)刷题,简单难度,第3题,回文数(python)

2020年9月11日 ☀ 今天是刷力扣的第2天。 希望通过刷力扣学点python编程思想和知识。不是最合适的答案,但是是自己想出的解决思路。如有更好的建议,欢迎指正~ 第3题:回文数 难度:简单 题目要求: 答案 (python): class Solution: def isPalindrome(self, x:int) -> bool: y = str(x) z = y[::-1] if y == z: ret

weixin_42866036的博客 542

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

大侠刷力扣(leetcode):回文数(9)

作者:隋顺意 微信:世界上的霸主 博客:Sui_da_xia 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。算法:想要判断此数是否为回文数,先要知道啥事回文数……

Sui_da_xia的博客 1422

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

力扣刷题记录-简单题

(2)思考:这一题的解法是运用数学的关系来递归求解。(2)思考:先把数组中第一个字符串拿出来与后面的字符串依次逐个位作比较,也就是strs[0]先和strs[1]作比较,然后让strs[0]和strs[2]作比较,直到把所有的数组元素遍历完。然后对于字符串s的每个字符遍历,如果是左括号,那么就在str数组中加入相对应的右括号,如果是右括号就判断str数组中的右括号是不是和它相等。:用for循环遍历,如果有两个数组内的数相加等于目标值,那么就记录下这两个数的下标,存放到一个结果数组里面,最后返回这个结果。

kk13140921的博客 1220

python力扣刷题——简单题

简单类题目分为11组,大概共有250道题目。 一天坚持刷8-10道题目,4.21开始,争取5.20刷完所有简单类题目。 一、数学类(36) 题号 题目及链接 7 整数反转 ...

weixin_45823221的博客 1279

leetcode 每日刷题记录:easy 题

1. 整数反转 题目描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。见 力扣:整数反转 输入:123 -123 120 输出: 321 -321 21 我的解法:代码不够简洁,没有考虑数字的范围 def reverse(x: int) -> int: st = [a...

冷月无声的博客 1504

LeetCode刷题09-简单 回文数

回文数

布小禅的博客 588

leetcode力扣刷题1,7,9

力扣刷题力扣1,两数之和7,整数反转9,回文数vs code配置leetcode 力扣 以下简介来源百度百科 力扣(LeetCode)是领扣网络旗下专注于程序员技术成长和企业技术人才服务的品牌。源自美国硅谷,力扣为全球程序员提供了专业的IT技术职业 化提升平台,有效帮助程序员实现快速进步和长期成长。 此外,力扣(LeetCode)致力于解决程序员技术评估、培训、职业匹配的痛点,逐步引领互联网技术求职和招聘迈向专业化。 1,两数之和 来看一下力扣的评论,哈哈 好了,言归正转,上题解: class

qq_56630261的博客 731

leetcode每日刷题计划-简单篇day1

leetcode每日刷题计划-简单篇day1 orzorz开始刷题 争取坚持每周平均下来简单题一天能做两道题吧 非常简单的题奇奇怪怪的错误orz越不做越菜 Num 7 整数反转Reverse Integer 刚开始多给了一个变量来回折腾占地方,没注意到溢出 因为有溢出,在返回的时候(int) ans 开始设置的时候设置long a...

weixin_34356310的博客 646

【PythonCode】力扣Leetcode6~10题Python版

Leetcode6-10

weixin_43790276的博客 1859

坚持刷力扣题第二周!!!

前言 接着上一篇文章,我已经坚持刷了八天的题和更新了八天的博客,八天一共刷了25题,有难有易,坚持一周对我来说已经是很大的一个进步了,但是这个活动昨天才开始哦!第一届LeetCode刷题打卡赢现金活动,其他小伙伴快来和我们一起卷起来吧!!!! 肝就完事,不说了我要上号了!! 2021-10-16 题目· 1.链表相交 题解 1.链表相交 这个链表相交其实就是相交的地方是相同的地址,所以我们可以遍历,然后在判定两个链表是否相等。 如果两个链表长度相等的话,就直接可以..

小宝的博客 1162

Leecode 刷题 简单题 个人汇总

为了以后的工作,要开始刷题啦!!!! 技术宅拯救世界!!!!!!!!!!! 先从简单题开始,慢慢来~~~~~~~~~~~~ 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 你可以按任意顺序返回答案。 示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums

paleatta的博客 828

【刷题之路】LeetCode 9.回文数

思路和方法1的改进版的思路差不多,只不过我们这次是直接取出x两端的数字进行比较(即取出最高位和最低位)。时间复杂度:O(log10(N)),N为数字x的值,每取一个数字,我们都要对x进行除10操作,所以时间复杂度为O(log10(N))。时间复杂度:O(n),n为数字的位数或字符串的长度,转化时的复杂度为log10n,逆序时的复杂度为n/2故复杂度为O(n)。时间复杂度:O(n),n为数字的位数或字符串的长度,转化时的复杂度为log10n,比较时的复杂度为n/2故复杂度为O(n)。因此它不是一个回文数。

kk702392702的博客 558
上一篇: LeetCode刷题之旅(简单-2):整数反转
下一篇: LeetCode刷题之旅(简单-4): 罗马数字转整数
后台技术汇
博客等级 码龄11年 670粉丝 531原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后台技术汇

对你的帮助,是对我的最好鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值