LeetCode【0009】回文数

本文目录

  • 1 中文题目
  • 2 求解思路
    • 2.1 基础解法:数字反转法
    • 2.2 优化解法: 双指针数学法
    • 2.3 最优解法:取一半数字法
  • 3 题目总结

1 中文题目

给你一个整数 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 -2^{31} \leq x \leq2^{31} - 1 231x2311

2 求解思路

2.1 基础解法:数字反转法

思路
将整个数字反转后与原数字比较,如果相等则为回文数。需要注意负数不可能是回文数,并且要处理反转时可能的整数溢出问题。

Python代码

class Solution:def isPalindrome(self, x: int) -> bool:"""判断一个整数是否是回文数参数:x: 输入的整数返回:布尔值,表示是否是回文数"""# 处理负数和以0结尾的非0数# 负数不可能是回文数# 除0以外,以0结尾的数不可能是回文数if x < 0 or (x != 0 and x % 10 == 0):return False# 处理0-9的个位数if x < 10:return True# 反转整个数字original = xreversed_num = 0# 逐位反转数字while x > 0:# 获取最后一位数字digit = x % 10# 处理溢出情况# Python不需要处理溢出,但如果在其他语言中需要处理if reversed_num > 214748364:  # 2^31-1 = 2147483647return False# 构建反转后的数字reversed_num = reversed_num * 10 + digit# 去掉原数字的最后一位x //= 10# 比较原数字和反转后的数字是否相等return original == reversed_num

时空复杂度分析

  • 时间复杂度分析 O(log n)
    • 需要遍历数字的每一位
    • n的位数大约是log10(n)
  • 空间复杂度分析 O(1)
    • 只使用了几个变量
    • 不需要额外的数据结构

2.2 优化解法: 双指针数学法

思路
通过数学运算获取数字的最高位和最低位(不转换为字符串),从两端向中间比较。使用除法获取最高位,取模获取最低位,每次比较后通过数学运算去除首尾数字,继续比较剩余部分,直到处理完所有位数。

python代码

class Solution:# 直接使用除法和取模def isPalindrome(self, x: int) -> bool:"""使用除法和取模的方式实现双指针比较"""# 处理负数和以0结尾的非0数if x < 0 or (x != 0 and x % 10 == 0):return False# 计算除数(用于获取最高位)div = 1while x // div >= 10:div *= 10# 从两端向中间比较while x > 0:# 获取最高位和最低位left = x // divright = x % 10# 比较最高位和最低位if left != right:return False# 去掉最高位和最低位x = (x % div) // 10# 除数要减少两位div //= 100return True

时空复杂度分析

  • 时间复杂度分析 O ( l o g n ) O(log n) O(logn)
    • 计算位数需要 O ( l o g n ) O(log n) O(logn)
    • 比较过程需要 O ( l o g n ) O(log n) O(logn)
  • 空间复杂度分析 O ( 1 ) O(1) O(1)
    • 只使用了固定数量的变量
    • 不需要额外的数据结构

2.3 最优解法:取一半数字法

思路
将数字后半部分反转,只需要一个简单的判断条件就能同时处理奇数位和偶数位的情况。当原数等于反转数 或 原数等于反转数去掉最后一位时,就是回文数。

算法步骤举例:

  • 对于偶数位数字1221:
x=1221, reversed_num=0
x=122, reversed_num=1
x=12, reversed_num=12
12 == 12 为true
  • 对于奇数位数字12321:
x=12321, reversed_num=0
x=1232, reversed_num=1
x=123, reversed_num=12
x=12, reversed_num=123
12 == 123//10 为true

python代码

class Solution:def isPalindrome(self, x: int) -> bool:"""取一半数字法的简洁实现参数:x: 输入的整数返回:布尔值,表示是否是回文数"""# 处理特殊情况:负数和以0结尾的非0数if x < 0 or (x != 0 and x % 10 == 0):return False# reversed_num存储反转后的后半部分数字reversed_num = 0# 当原始数字大于反转数字时继续处理# 这确保我们只处理后半部分数字while x > reversed_num:# 取出x的最后一位,加入到反转数字中reversed_num = reversed_num * 10 + x % 10# 去掉x的最后一位x //= 10# 统一处理奇数位和偶数位的情况:# 偶数位:x == reversed_num (例如:1221)# 奇数位:x == reversed_num//10 (例如:12321)return x == reversed_num or x == reversed_num // 10

时空复杂度分析

  • 时间复杂度:O(log n)
    • 只处理数字的一半位数
    • 每次操作是常数时间
  • 空间复杂度:O(1)

3 题目总结

题目难度:简单
应用算法:双指针、数学计算

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

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

相关文章

Python 数据可视化详解教程

Python 数据可视化详解教程 数据可视化是数据分析中不可或缺的一部分&#xff0c;它通过图形化的方式展示数据&#xff0c;帮助我们更直观地理解和分析数据。Python 作为一种强大的编程语言&#xff0c;拥有丰富的数据可视化库&#xff0c;如 Matplotlib、Seaborn、Plotly 和 …

微服务架构面试内容整理-服务注册与发现-Nacos

Nacos:一个开源的动态服务发现、配置管理和服务管理平台,由阿里巴巴开发。它为微服务架构提供了易于使用的解决方案,能够帮助开发者管理服务的注册、发现和配置。以下是 Nacos 的主要特点、工作原理和使用场景: 主要特点 1. 服务发现: Nacos 支持 DNS 和 RPC 的服务发现方…

硬件基础17 半导体存储器——随机存取存储器RAM

目录 一、异步SRAM 二、同步SRAM 三、DRAM 四、字长位数扩展 五、字数的扩展 RAM是另一大类存储器&#xff0c;它与ROM的最大区别就是数据易失性&#xff0c;一旦失去电源供电&#xff0c;所存储的数据立即丢失。最大优点是可以随时快速地从其中任一指定地址读出&#xff…

安装VMware Tools选项显示灰色以及连接不上服务器,下载出错的正确解决办法

1.显示灰色解决办法&#xff1a; 解决办法&#xff1a; 关闭虚拟机 选择“虚拟机设置”&#xff0c;分别添加一个“软盘”和一个“CD/DVD”&#xff0c;并将所有软盘和CD/DVD&#xff08;包括自带的&#xff09;“连接”选项全部更改为“使用物理驱动器” 2.关闭虚拟机重启即…

c++ 异或运算

概念 异或&#xff08;XOR&#xff09;运算是计算机中常用的位运算之一&#xff0c;符号为 ^&#xff0c;其定义如下&#xff1a; 相同为0&#xff0c;不同为1&#xff1a;对于两个二进制位&#xff0c;如果相同则结果为0&#xff0c;如果不同则结果为1。 性质 交换律&…

git中使用tag(标签)的方法及重要性

在Git中打标签&#xff08;tag&#xff09;通常用于标记发布版本或其他重要提交。 Git中打标签的步骤&#xff1a; 列出当前所有的标签 git tag创建一个指向特定提交的标签 git tag <tagname> <commit-hash>创建一个带注释的标签&#xff0c;通常用于发布版本 git…

解方程(C语言)

题目描述 给出n个整数和x&#xff0c;请问这n个整数中是否存在三个数a&#xff0c;b&#xff0c;c使得ax2bxc0&#xff0c;数字可以重复使用。 输入描述: 第一行两个整数n&#xff0c;x 第二行n个整数a[i]表示可以用的数 1 < n < 1000, -1000 < a[i], x < 1000 …

CSS3_3D变换(七)

1、CSS3_3D变换 1.1 3D空间与景深 3D空间&#xff1a;在父元素中将属性transform-style设置为preserve-3d开启3D空间&#xff0c;默认值为flat&#xff08;开启2D空间&#xff09;&#xff1b; 景深&#xff1a;人眼与平面的距离&#xff0c;产生透视效果&#xff0c;使得效果…

BMC运维管理:IPMI实现服务器远控制

IPMI实现服务器远控制 实操一、使用IPMI重置BMC用户密码实操二、使用IPMI配置BMC的静态IP实操三、IPMI实现BMC和主机控制操作实操四、ipmitool查看服务器基本信息实操五、ipmitool实现问题定位BMC(Baseboard Management Controller,基板管理控制器)是服务器硬件的一个独立管…

Android Profiler 内存分析

Android studio&#xff08;下面简称AS&#xff09;为App提供的性能分析工具&#xff0c;在AS3.0替换掉旧的分析工具&#xff0c;对于其使用方法&#xff0c;官方也有对应的介绍&#xff1a;Android Profiler 对于使用方法&#xff0c;我只用到比较简单的功能&#xff0c;高级的…

vue3 基于element-plus进行的一个可拖动改变导航与内容区域大小的简单方法

1、先上个截图&#xff1a; 说明&#xff1a;拖动上面的分隔栏就可以实现&#xff0c;改变左右区域的大小。 2、上面的例子来自官网的&#xff1a; Container 布局容器 | Element Plus 3、拖动的效果来自&#xff1a; https://juejin.cn/post/7029640316999172104#heading-1…

adminPage-vue3依赖DetailsModule版本说明:V1.2.1——1) - 新增span与labelSpan属性

文章目录 更新内容DetailsModuleAPI汇总属性自定义对象config.list(array<object> 类型) 使用span属性&#xff08;24栅格系统&#xff09; 更新内容 新增span与labelSpan属性&#xff0c;当使用span属性时将不适用默认的布局&#xff0c;如果24栅格系统进行重新布局 D…

系统聚类的分类数确定——聚合系数法

breast_cancer数据集分析——乳腺癌诊断 #读取乳腺癌数据 import pandas as pd import numpy as np from sklearn.datasets import load_breast_cancer data load_breast_cancer() X data.data y data.target.. _breast_cancer_dataset:Breast cancer wisconsin (diagnosti…

Android 实现柱形图

在 Android 中实现柱状图&#xff0c;可以使用流行的图表库 MPAndroidChart&#xff0c;它支持多种类型的图表&#xff0c;包括柱状图、折线图、饼图等。下面是一个基本的柱状图实现步骤&#xff0c;具体分为以下几个部分&#xff1a; 1. 添加依赖 首先&#xff0c;你需要在 …

dolphin 配置data 从文件导入hive 实践(一)

datax 支持多种数据源的相互读写&#xff0c;作为开源软件&#xff0c;提供了离线采集功能&#xff0c;方便系统开发&#xff0c;过程中遇到诸多配置&#xff0c;需要开发者自己探索&#xff0c;免费同样有成本 配置模板 {"setting": {},"job": {"s…

TypeScript 类型进阶指南

上篇文章讲述了泛型的基础用法&#xff0c;下面是关于 TypeScript 泛型的一些高级知识点&#xff0c;简单介绍一下。 1. 条件类型中的泛型约束 条件类型 (T extends U ? X : Y) 是 TypeScript 的一种高级特性&#xff0c;它根据类型的条件返回不同的结果。这种约束在泛型中非…

mysql5 授权

1、允许来自任意网段的root用户远程连接 所有 数据库并拥有所有权限 格式&#xff1a;grant 权限 on 数据库.* to 用户名登录主机 identified by “密码”; mysql> grant all privileges on *.* to root% identified by 123456; mysql> flush privileges;2、只允许来自1…

Neo4j 和 Python 初学者指南:如何使用可选关系匹配优化 Cypher 查询

Neo4j 和 Python 初学者指南&#xff1a;如何使用可选关系匹配优化 Cypher 查询 查询需求分析目标查询结构 编写 Cypher 查询查询解析OPTIONAL MATCH 和 COALESCE 的作用 在 Python 中使用 Neo4j 驱动执行查询使用 neo4j 驱动的 Python 示例代码代码解析示例输出 总结 在使用 N…

Gradle 创建Spring Boot项目

在 Spring Boot 项目中&#xff0c;Gradle 插件可以让你更方便地管理依赖、打包、运行和测试 Spring Boot 应用。以下是如何使用 Spring Boot Gradle 插件的详细指南&#xff1a; 1. 引入 Spring Boot 插件 在 build.gradle 中引入 Spring Boot 插件可以为项目提供各种便捷的…

AUTOSAR CP Ethernet State Manager(EthSM)规范的主要功能以及工作原理导读

AUTOSAR Ethernet State Manager&#xff08;以下简称EthSM&#xff09;规范的主要功能 AUTOSAR Ethernet State Manager&#xff08;以下简称EthSM&#xff09;规范的主要功能包括&#xff1a; 通信控制 网络模式管理&#xff1a;为通信管理器&#xff08;ComM&#xff09;提…