算法小白刷力扣 3 - 回文数

news2024/11/24 22:42:32

题目描述

原题链接:https://leetcode.cn/problems/palindrome-number/description/


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

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

示例 1:
输入:x = 121
输出:true

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

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

  • 提示:
    -2^31 <= x <= 2^31 - 1

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

解法一:暴力破解

根据回文数的特征,对任意大于两位的数字,对称位置上的两个数字相等即可,按照这种思路很容易想到循环比较对称位置上的数字的方式去实现,但由于无法直接对比对称位数字,就需要将数字转为字符串或字符数组(二者差别不大)进行比较判断,这种方式会额外增加空间,且数字转字符串也会增加耗时,是暴力破解的方式。

class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0) {
            return false;
        }
        if(x < 10) {
            return true;
        }
        // 将数字转为字符串
        String s = x + "";
        // 再转为字符数组
        char[] chars = s.toCharArray();
        // 因为只需要比较数字两边对称的部分,因此只需遍历 chars.length / 2 次,对数字长度为偶数和奇数都适用
        // 第[i]位和第 [chars.length-1-i]的数字为一对,如果每一对数字都相同则为回文数,否则只要有一对不相等,则不是回文数
        // 该方法利用了数组可以随机查询任意位置的数字的特性暴力循环判断
        for(int i = 0; i < chars.length / 2; i++) {
            if(chars[i] != chars[chars.length - 1 - i]) {
                return false;
            }
        }
        return true;
    }
}

思路二:全翻转比较

另一种思路是既然数字从前往后读和从后往前读是一样的,那只要将数字全部翻转过来,与原来的数字进行比较,如果两数相等则肯定就是回文数了。这种方式理解起来最简单直接,如果知道数字怎么翻转,实现起来也很简单。需要注意的是,因为要比较翻转前后的数字,所以不能直接修改原数x,在翻转前需要替换原数字为新数进行翻转,然后将翻转结果与原数字比较。

class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0) {
            return false;
        }
        if(x < 10) {
            return true;
        }
        // 将数字完全翻转
        int r = 0;
        int temp = x;
        while (temp != 0) {
            r = r * 10 + temp % 10;
            temp /= 10;
        }
        // 翻转后的数字如果与原数字相等,则肯定为回文数
        return r == x;
    }
}

用这种方式提交后可以通过 LeetCode 的测试用例,但是这种情况存在翻转后的数字超出最大数范围的可能。无论从时间复杂度(O(n))还是准确性上来说都不是最优解。

要理解这种方式,就需要知道如何将一个整数进行翻转。思路可以用下面一张图解释:
在这里插入图片描述
整体的代码如下:

public int reverseNumber(int num) {
    int i = 0;
    while (num != 0) {
        i = i * 10 + num % 10;
        // 移位
        num = num / 10;
    }
    return i;
}

思路三:半翻转比较

这种算法是最优的,但可惜我没想到,是在看了 LeetCode 官方题解后才知道的,但在思考的过程中也曾擦肩而过 😃

既然是比较对称位上的数字,那何不只取一半的数字进行比较呢,这样耗时更少且不会出现溢出的可能。例如,对于数字 1221这种偶数位数字,只需翻转取出后两位为12,其和前两位数12相等,即为回文数;又对于12321奇数位数字,翻转取出后两位12,不考虑中间位数字3,其和前两位12也相等,是回文数。
但是数字不能轻易像字符串那样知道总共有多少位,如何知道翻转到一半呢?这个问题是这种解法的核心所在。
在这里插入图片描述
LeetCode官方题解的思路是:“由于整个过程我们不断将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于或等于反转后的数字时,就意味着我们已经处理了一半位数的数字了。” 这个想法很新奇(个人脑子认为),它认为已经翻转的数字位数大于或等于未翻转的数字位数,则肯定已经翻转了一半或超过一半,就停止翻转。此时,如果数字长度为偶数位,则只要翻转后的数字与还未翻转的数字相等即是回文数;如果数字长度为奇数,只要再去掉翻转后数字的最后一位,也就是原本数字的中间一位,其如果与还未翻转的数字相等,则是回文数。如上图(图片摘取自LeetCode官方题解),这种方法无需将数字转为字符串额外增加空间,而且由于是翻转一半,效率更高,肯定也不会溢出。代码如下:

class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0 || (x % 10 == 0 && x != 0)) {
            return false;
        }
        int r = 0;
        // 每次翻转之前,只要未翻转的数字大于已翻转的数字,则说明还要继续翻转
        while (x > r) {
            r = r * 10 + x % 10;
            x /= 10;
        }
        // 翻转一半后两边数字比较有两种情况时为回文数:
        // 数字长度为偶数时 r == x, 例如对于 11, 1221
        // 数字长度为奇数时 r == x / 10, 例如对于 121, 12321
        return r == x || r / 10 == x;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2061621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【功能自动化】使用Excel文档获取参数数据

环境搭建&#xff1a; 1.需要配置WebTours网站 2.安装pandas pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python_dateutil…

EasyExcel 导入计算公式导出展示字符串问题(SUM)

导出自定义表单 结果遇到 SUM函数 时 没有算出结果&#xff0c;直接展示的函数字符串 处理思路 拦截公式字符串 &#xff1a; 将对应的cell 设置 setCellFormula 字符串公式 然后cell类型设置为 CellType.FORMULA 重新配置 这样就解决了问题。 注意先设置CellFormula 然…

物品租赁管理系统-押金预授权-原路退回系统-SAAS本地化及未来之窗行业应用跨平台架构

一、物品租赁管理必要性 经济角度 1. 降低成本 - 对于租赁方而言&#xff0c;无需一次性投入大量资金购买物品。比如&#xff0c;企业在项目初期&#xff0c;如果购买昂贵的设备&#xff0c;会占用大量流动资金&#xff0c;增加财务风险。而通过租赁&#xff0c;可以将固…

从0开始搭建一个SpringBoot项目(从环境配置到运行项目)

文章目录 环境配置JAVA环境配置MySQL数据库配置IDEA安装Navicat 15安装Maven配置 SpringBoot项目创建 环境配置 JAVA环境配置 JDK8下载&#xff1a; 官网下载CSDN下载网盘 安装JDK&#xff0c;一直下一步即可&#xff0c;注意安装的位置&#xff1a; 3. 配置环境变量 &…

R语言统计分析——回归中的异常观测值

参考资料&#xff1a;R语言实战【第2版】 一个全面的回归分析要覆盖对异常值的分析&#xff0c;包括离群点、高杠杆点和强影响点。这些数据点需要更深入的研究&#xff0c;因为它们在一定程度上与其他观点不同&#xff0c;可能对结果产生较大的负面影响。 1、离群点 离群点是指…

【MySQL 10】表的内外连接 (带思维导图)

文章目录 &#x1f308; 一、内连接⭐ 0. 准备工作⭐ 1. 隐式内连接⭐ 2. 显式内连接 &#x1f308; 二、外连接⭐ 0. 准备工作⭐ 1. 左外连接⭐ 2. 右外连接 &#x1f308; 一、内连接 内连接实际上就是利用 where 子句对两张表形成的笛卡儿积进行筛选&#xff0c;之前所有的…

git错误fatal: Unpack error, check server log

git错误fatal: Unpack error, check server log fatal: Unpack error, check server log error: remote unpack failed: error Missing tree xxxxxxxxxxxxxxxxxx 先执行 git fetch 命令&#xff0c;再push。 git拉取远程所有分支/添加远程仓库_git pull所有分支代码-CSDN博客…

SQL基础——MySQL的触发器、存储引擎、事务

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 一、MySQL的触发器 1.概述 介绍 触发器&#xff0c;就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL片段&#xff0c;但是触发器无需调用&…

StarRocks 存算分离 Compaction 原理

前言 StarRocks 中每次数据摄入都会生成一个新的数据版本&#xff0c;而查询时需要将所有版本数据进行合并才能获得一个正确的结果&#xff0c;如果历史数据版本太多&#xff0c;那么查询时需要读取的文件数也会很多&#xff0c;造成查询效率低下。因而 StarRocks 存在内部任务…

【电子通识】IPC-A-600中对验收标准的定义

在文章【电子通识】IPC-A-610标准对产品的四种验收条件都是什么意思&#xff1f;中我们讲到IPC-A-610标准&#xff08;电子组件的可接受性&#xff09;对于产品的四种验收条件。本文中我们同理讲一讲IPC-A-600中对验收标准的定义。 IPC-A-600文件中的多数示意图和照片同时表示每…

66 IPV4/6 OSPFV2/3 实操

一 网络括谱图 二 IPV6 一 华为IPV6地址的配置思路 1 全局上开启IPV6功能 # ipv6 # 2 在指定的接口上配置IPV6地址上的接口上配置IPV6地址 ipv6 enable 3 在接口上配置IPV6地址 ipv6 address 2001:1::254/64 脚本 # interface GigabitEthernet0/0/1 ipv6 enable ip add…

怎么快速定位bug?如何编写测试用例?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 作为一名测试人员如果连常见的系统问题都不知道如何分析&#xff0c;频繁将前端人员问题指派给后端人员&#xff0c;后端人员问题指派给前端人员&#xff0c;那么在…

set容器

基本概念 set容器只有键值&#xff0c;插入容器的时候自动根据键值排序&#xff0c;不允许有相同的键值set的迭代器是只读迭代器multiset特性及用法和set完全相同&#xff0c;唯一的差别就是在于他允许键值重复&#xff0c;set和multiset底层实现都是红黑树 常用操作&#xff…

nordic 蓝牙ble ble_hids_inp_rep_send发送数据采用缓存机制 发送失败后 检测到上一个发送完成再重新发前一个发送失败的数据

目录 1. 定义缓存结构 2. 初始化缓存队列 3. 添加数据到缓存队列 4. 发送数据函数 5. 初始化和事件处理 总结 在Nordic Semiconductor的BLE开发中,如果需要实现一种缓存机制来确保数据发送的可靠性,可以通过以下步骤实现: 定义缓存结构:用于存储待发送的数据。发送数据…

Axure设计之单选框教程(中继器)

在Axure RP中&#xff0c;通过结合中继器的强大功能&#xff0c;我们可以轻松实现动态加载的单选框列表&#xff0c;不仅可以根据数据自动调整选项宽度&#xff0c;还能实时更新选中状态。本教程将引导你完成一个使用中继器制作动态单选框列表的项目&#xff0c;包括案例分析、…

【论文阅读】DaST: Data-free Substitute Training for Adversarial Attacks(2020)

摘要 Machine learning models&#xff08;机器学习模型&#xff09; are vulnerable&#xff08;容易受到&#xff09; to adversarial examples&#xff08;对抗样本&#xff09;. For the black-box setting&#xff08;对于黑盒设置&#xff09;, current substitute atta…

Spring-MVC 结合 Swagger2

目录 一、引入依赖 二、创建Swagger配置类 三、修改Spring-MVC配置文件 四、在游览器打开 五、配置 Swagger 六、使用 Swagger 七、Swagger 的常用注解 ApiOperation() ApiModel ()、ApiModelProperty () 一、引入依赖 <dependency><groupId>io.springf…

Q*算法深度猜猜:从Q-learning优化到智能决策

Q*算法深度猜猜&#xff1a;从Q-learning优化到智能决策 引言 在强化学习&#xff08;Reinforcement Learning&#xff09;中&#xff0c;Q-learning算法作为一种无模型的学习方法&#xff0c;被广泛应用于解决各种决策优化问题。然而&#xff0c;尽管Q-learning在许多场景下…

游戏引擎详解——图片

图片 图片的格式 图片文件格式pngjpg 纹理压缩格式ETC1/2PVRTCASTC 图片的属性 图片属性解释分辨率宽高像素值&#xff08;pt&#xff09;&#xff0c;如&#xff1a;1024*1024位深度用来存储像素颜色的值&#xff0c;如RGBA8888&#xff0c;红黄蓝透明度4个维度每个8bit&…

在Windows Server 2012 R2上安装.NET Framework 3.5

在Windows Server 2012 R2上安装.NET Framework 3.5&#xff0c;可以按照以下步骤进行&#xff1a; 打开服务器管理器&#xff1a; 首先&#xff0c;登录到Windows Server 2012 R2的服务器。然后&#xff0c;打开“服务器管理器”。添加角色和功能&#xff1a; 在“服务器管理…