【LeetCode刷题笔记(13-1)】【Python】【回文数】【反转整数】【简单】

文章目录

  • 引言
  • 回文数
    • 题目描述
    • 提示
  • 题意分析
  • 解决方案1:【反转字符串】
  • 解决方案2:【反转整数】
  • 题外话
  • 结束语

9. 回文数


引言

编写通过所有测试案例的代码并不简单,通常需要深思熟虑理性分析。虽然这些代码能够通过所有的测试案例,但如果不了解代码背后的思考过程,那么这些代码可能并不容易被理解和接受。我编写刷题笔记的初衷,是希望能够与读者们分享一个完整的代码是如何在逐步的理性思考下形成的。我非常欢迎读者的批评和指正,因为我知道我的观点可能并不完全正确,您的反馈将帮助我不断进步。如果我的笔记能给您带来哪怕是一点点的启示,我也会感到非常荣幸。同时,我也希望我的分享能够激发您的灵感和思考,让我们一起在编程的道路上不断前行~

回文数

题目描述

给你一个整数 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. 依据示例2,对于负整数,由于存在"-"号,不可能构成回文数;
  2. 依据示例3,对于末尾数字为0的整数(0除外),不可能构成回文数,因为0不可能出现在正整数开头

因此,对于符合规律1/2的输入,我们可以先通过if语句直接返回False

即:

class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x < 0 or (x % 10 == 0 and x != 0):
            return False

解决方案1:【反转字符串】

图1 题目暗示

题意告诉我们,进阶做法是不能基于字符串解决【回文数】这个问题 ===> 基于字符串的做法应该比较简单且容易上手。

实际上,基于字符串的解法确实非常简单,

完整代码如下

class Solution:
    def isPalindrome(self, x: int) -> bool:
        x_str = str(x) # 将整数x转换为字符串x_str
        return x_str == x_str[::-1]

从代码中可以看出,我们只需要三步即可解决【回文数】问题:

  1. 利用str()将整数x强制类型转换为字符串x_str
  2. 利用[::-1]将字符串反转;
  3. 比较反转前和反转后的字符串是否一致,一致则是回文数,返回True,否则返回False

运行结果

图2 运行结果

解决方案2:【反转整数】

问题1:如果题目不提示【字符串】解法,一般我们会想到什么方法呢?

我们一般不会离开"整数"这个范畴去解决问题 ===> 正常步骤应该是:

  1. 将整数x进行反转,变成另一个整数x_reverse
  2. 比较反转前的x和反转后的x_reverse,判断这两个整数是否相等,相等则是回文数,返回True,否则返回False

完整代码如下:

class Solution:  
    """  
    判断一个整数是否是回文数。  
      
    Args:  
        x (int): 待判断的整数。  
      
    Returns:  
        bool: 如果x是回文数,则返回True;否则返回False。  
    """  
    def isPalindrome(self, x: int) -> bool:  
    	# 边界条件
        if x < 0 or (x % 10 == 0 and x != 0):  
            return False  
  
        # 初始化反转后的数为0  
        x_reverse = 0  
        # 保存原始的x值,以便后面与反转后的数进行比较  
        x_tmp = x  
        # 当x_tmp大于等于1时执行循环,将x_tmp的个位数逐个取出并放到反转后的数中  
        while x_tmp >= 1:  
            # 当前取出的个位数为 x_tmp % 10 
            x_reverse = x_reverse * 10 + x_tmp % 10  # 当前反转数乘以10 + 当前取出的个位数
            # 将x_tmp除以10,去掉当前个位数  
            x_tmp = x_tmp // 10  
        
        
        return x_reverse == x

运行结果:

图3 运行结果

复杂度分析

  • 时间复杂度:O(logn),其中 n 为输入的整数。
  • 空间复杂度:O(1)
    • 只需要常数空间存放若干变量 ===> O(1)

细节1:尽管将整数完全反转可以通过所有测试用例,但如果题目不仅要求输入x满足 -231 <= x <= 231 - 1,而且要求反转后的x_reverse也满足 -231 <= x_reverse <= 231 - 1,那么将整数完全反转可能会导致x_reverse溢出。

由于231 - 1 = 2147483647,如果整数x=2147483647,那么x_reverse=7463847412 > 231 - 1 ⇒ x_reverse溢出。

图3 示例结果

问题2:为什么把x=2147483647作为测试用例时,将整数完全反转的算法仍然能通过呢?

在Python3中,整数类型只有int,没有限制大小!!! ⇒ 理论上,Python 3中的整数没有上限(只要不超出内存空间)⇒ 将整数完全反转的算法面对有溢出风险的输入仍能顺利运行。

题外话

实际上,方案2仍然有进一步优化的空间,因为我们一直没有使用回文数的一个重要性质:对称性 ⇒ 我们实际上只需要反转一半的数字,就可以判断输入x是否为回文了。

参考链接

结束语

  • 亲爱的读者,感谢您花时间阅读我们的博客。我们非常重视您的反馈和意见,因此在这里鼓励您对我们的博客进行评论。
  • 您的建议和看法对我们来说非常重要,这有助于我们更好地了解您的需求,并提供更高质量的内容和服务。
  • 无论您是喜欢我们的博客还是对其有任何疑问或建议,我们都非常期待您的留言。让我们一起互动,共同进步!谢谢您的支持和参与!
  • 我会坚持不懈地创作,并持续优化博文质量,为您提供更好的阅读体验。
  • 谢谢您的阅读!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

blender scripting 编写

blender scripting 编写 一、查看ui按钮对应的代码二、查看或修改对象名称三、案例&#xff1a;渲染多张图片并导出对应的相机参数 一、查看ui按钮对应的代码 二、查看或修改对象名称 三、案例&#xff1a;渲染多张图片并导出对应的相机参数 注&#xff1a;通过ui交互都设置好…

基于springboot+vue的教材管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

windows操作系统蓝屏错误日志分析日志通用方法全网唯一程序员必学技能

windows11操作系统蓝屏错误分析日志通用方法全网唯一程序员必学技能 一、背景介绍 本人是一个老程序员&#xff0c;DBA&#xff0c;架构师&#xff0c;开发工作10年了&#xff0c;我们平常用的开发电脑以及游戏电脑时不时会遇到操作系统突然蓝屏&#xff0c;一般情况下都是一…

C++力扣题目232--用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头…

ThingsBoard 3.4 -- 规则链使用

规则链的使用 创建规则链 调试模式用于调试日志的输出&#xff0c;测试阶段建议选择 配置规则 点击规则链&#xff0c;进入详情页面 打开规则链进行规则配置 规则链节点类型分为6类&#xff0c;每一类下面又包含多个小类 过滤器/筛选器&#xff1a;过滤器节点用于消息过滤…

springboot对接WebSocket实现消息推送

1.修改pom文件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency> 2.增加配置WebSocketConfig.java import org.springframework.context.annotation.Bean…

网络隔离后,怎样建立高效安全的数据安全交换通道?

数据安全对企业生存发展有着举足轻重的影响&#xff0c;数据资产的外泄、破坏都会导致企业无可挽回的经济损失和核心竞争力缺失。数据流动才能让其释放价值&#xff0c;想要保护企业核心资产&#xff0c;就要实现数据安全交换。 很多企业为了防止知识产权、商业机密数据泄露&am…

2023安洵杯-秦岭防御军wp

reverse 感觉有点点简单## import base64 def ba64_decode(str1_1):mapp "4KBbSzwWClkZ2gsr1qAQu0FtxOm6/iVcJHPY9GNp7EaRoDf8UvIjnL5MydTX3eh"data_1 [0] * 4flag_1 [0] * 3for i in range(32, 127):for y in range(32, 127):for k in range(32, 127):flag_1[0]…

【目标跟踪】解决多目标跟踪遮挡问题

文章目录 前言一、判定遮挡目标二、扩展目标框三、结论 前言 目标跟踪在发生遮挡时&#xff0c;极其容易发生Id Switch。网上许多算法忽视跟踪遮挡问题,同时网上相关资料也很少。博主为了解决跟踪遮挡&#xff0c;翻阅大量论文。分享其中一篇论文。论文链接&#xff1a;https:…

dl转置卷积

转置卷积 转置卷积&#xff0c;顾名思义&#xff0c;通过名字我们应该就能看出来&#xff0c;其作用和卷积相反&#xff0c;它可以使得图像的像素增多 上图的意思是&#xff0c;输入是22的图像&#xff0c;卷积核为22的矩阵&#xff0c;然后变换成3*3的矩阵 代码如下 import…

Python 运维(四):使用 PyInstaller 将 Python 程序打包成可执行文件

大家好&#xff0c;我是水滴~~ PyInstaller是一款强大的Python打包工具&#xff0c;通过将Python程序转换成可执行文件&#xff0c;它简化了程序的分享和分发过程。本文从简介、安装、使用以及典型案例四个方面对PyInstaller进行了介绍。 文章内容包含大量的示例代码&#xf…

Vue学习之第一、二章——Vue核心与组件化编程

第一章. Vue核心 1.1 Vue简介 1.1.1 官网 英文官网: https://vuejs.org/中文官网: https://cn.vuejs.org/ 1.1.2 Vue特点 遵循 MVVM 模式编码简洁, 体积小, 运行效率高, 适合移动/PC 端开发它本身只关注 UI, 也可以引入其它第三方库开发项目 1.2 初始Vue 这里可以参考&a…

uni-app 命令行创建

1. 首先创建项目&#xff0c;命令如下: npx degit dcloudio/uni-preset-vue#vite-ts uni-app-demo如果出现报错&#xff0c;如下图. 大概率就是没有目录C:\Users\Administrator\AppData\Roaming\npm 解决办法&#xff1a; 创建目录 C:\Users\Administrator\AppData\Roaming\n…

关于Zoom ZTP和AudioCodes Ltd桌面电话缺陷暴露,导致用户遭受窃听的动态情报

一、基本内容 近期SySS安全研究员发布分析报告显示&#xff0c;Zoom的零接触&#xff08;ZTP&#xff09;和AudioCodes Ltd桌面电话配置功能中发现高危漏洞&#xff0c;可以获得对设备的完全远程控制并不受限制的访问可以被武器化&#xff0c;以窃听房间或电话、通过设备并攻击…

LazyForEach常见使用问题

目录 1、渲染结果非预期 2、重新渲染时图片闪烁 3、ObjectLink属性变化UI未更新 上篇文章中我们介绍了LazyForEach的基本使用&#xff0c;展示了如何使用LazyForEach构造一个列表&#xff0c;并演示数据的添加、删除、修改如何与LazyForEach配合并正确的更新UI。本篇将介绍使…

【kafka消息里会有乱序消费的情况吗?如果有,是怎么解决的?】

文章目录 什么是消息乱序消费了&#xff1f;顺序生产&#xff0c;顺序存储&#xff0c;顺序消费如何解决乱序数据库乐观锁是怎么解决这个乱序问题吗 保证消息顺序消费两种方案固定分区方案乐观锁实现方案 前几天刷着视频看见评论区有大佬问了这个问题&#xff1a;你们的kafka消…

策略模式(组件协作)

策略模式&#xff08;组件协作&#xff09; 链接&#xff1a;策略模式实例代码 注解 目的 正常情况下&#xff0c;一个类/对象中会包含其所有可能会使用的内外方法&#xff0c;但是一般情况下&#xff0c;这些常使用的类都是由不同的父类继承、组合得来的&#xff0c;来实现…

《软件需求分析报告》

第1章 序言 第2章 引言 2.1 项目概述 2.2 编写目的 2.3 文档约定 2.4 预期读者及阅读建议 第3章 技术要求 3.1 软件开发要求 第4章 项目建设内容 第5章 系统安全需求 5.1 物理设计安全 5.2 系统安全设计 5.3 网络安全设计 5.4 应用安全设计 5.5 对用户安全管理 …

创建servlet的三种方式

目录 ​编辑 1.实现Servlet接口的方式 2.继承GenericServlet抽象类的方式 3.继承HttpServlet的方式 1.实现Servlet接口的方式 因为是实现 Servlet 接口&#xff0c;所以我们需要实现接口里的方法。 import javax.servlet.*; import javax.servlet.annotation.WebServlet;…

DS八大排序之归并排序和计数排序

前言 前几期我们详细介绍了插入排序&#xff08;直接插入排序和希尔排序&#xff09;、选择排序&#xff08;直接选择和堆排序&#xff09;、交换排序&#xff08;冒泡排序和快速排序&#xff09;。并对快排的各个版本做了详细的介绍&#xff0c;本期我们来介绍把最后两个即外…