[LeetCode] 7.整数反转

一、题目描述

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:

输入:x = 123
输出:321

示例 2:

输入:x = -123
输出:-321

示例 3:

输入:x = 120
输出:21

示例 4:

输入:x = 0
输出:0

提示:

  • -231 <= x <= 231 - 1

二、题解

r e v rev rev 为翻转后的数字,为完成翻转,我们可以重复「弹出」 x x x 的末尾数字,将其「推入」 r e v rev rev 的末尾,直至 x x x 为 0。

要在没有辅助栈或数组的帮助下「弹出」和「推入」数字,我们可以使用如下数学方法:

// 弹出 x 的末尾数字 digit
digit = x % 10
x /= 10// 将数字 digit 推入 rev 末尾
rev = rev * 10 + digit

题目需要判断反转后的数字是否超过 32 位有符号整数的范围 [ − 2 31 , 2 31 − 1 ] [-2^{31},2^{31}-1] [231,2311],例如 x = 2123456789 x=2123456789 x=2123456789 反转后的 r e v = 9876543212 > 2 31 − 1 = 2147483647 rev=9876543212>2^{31}−1=2147483647 rev=9876543212>2311=2147483647,超过了 32 位有符号整数的范围。

因此我们需要在「推入」数字之前,判断是否满足

− 2 31 ≤ r e v ⋅ 10 + d i g i t ≤ 2 31 − 1 −2^{31}≤rev⋅10+digit≤2^{31}−1 231rev10+digit2311
若该不等式不成立则返回 000。

但是题目要求不允许使用 64 位整数,即运算过程中的数字必须在 32 位有符号整数的范围内,因此我们不能直接按照上述式子计算,需要另寻他路。

考虑 x > 0 x>0 x>0 的情况,记 I N T M A X = 2 31 − 1 = 2147483647 INT_MAX=2^{31}−1=2147483647 INTMAX=2311=2147483647,由于
INT_MAX = ⌊ INT_MAX 10 ⌋ ⋅ 10 + ( INT_MAX m o d 10 ) = ⌊ INT_MAX 10 ⌋ ⋅ 10 + 7 \begin{aligned} \textit{INT\_MAX}&=\lfloor\dfrac{\textit{INT\_MAX}}{10}\rfloor\cdot10+(\textit{INT\_MAX}\bmod10)\\ &=\lfloor\dfrac{\textit{INT\_MAX}}{10}\rfloor\cdot10+7 \end{aligned} INT_MAX=10INT_MAX10+(INT_MAXmod10)=10INT_MAX10+7

则不等式

rev ⋅ 10 + digit ≤ INT_MAX \textit{rev}\cdot10+\textit{digit}\le\textit{INT\_MAX} rev10+digitINT_MAX

等价于

r e v ⋅ 10 + d i g i t ≤ ⌊ I N T _ M A X 10 ⌋ ⋅ 10 + 7 rev⋅10+digit≤⌊INT\_MAX10⌋⋅10+7 rev10+digitINT_MAX1010+7

移项得

( r e v − ⌊ I N T _ M A X 10 ⌋ ) ⋅ 10 ≤ 7 − d i g i t (rev−⌊INT\_MAX10⌋)⋅10≤7−digit (revINT_MAX10⌋)107digit

讨论该不等式成立的条件:

r e v > ⌊ I N T _ M A X 10 ⌋ rev>⌊INT\_MAX10⌋ rev>INT_MAX10,由于 d i g i t ≥ 0 digit≥0 digit0,不等式不成立。 若 r e v = ⌊ I N T _ M A X 10 ⌋ rev=⌊INT\_MAX10⌋ rev=INT_MAX10,当且仅当 d i g i t ≤ 7 digit≤7 digit7 时,不等式成立。 若 r e v < ⌊ I N T _ M A X 10 ⌋ rev<⌊INT\_MAX10⌋ rev<INT_MAX10,由于 d i g i t ≤ 9 digit≤9 digit9,不等式成立。

注意到当 r e v = ⌊ I N T _ M A X 10 ⌋ rev=⌊INT\_MAX10⌋ rev=INT_MAX10 时若还能推入数字,则说明 x x x 的位数与 I N T _ M A X INT\_MAX INT_MAX 的位数相同,且要推入的数字 d i g i t digit digit x x x 的最高位。由于 x x x 不超过 I N T _ M A X INT\_MAX INT_MAX,因此 d i g i t digit digit 不会超过 I N T _ M A X INT\_MAX INT_MAX 的最高位,即 d i g i t ≤ 2 digit≤2 digit2。所以实际上当 r e v = ⌊ I N T _ M A X 10 ⌋ rev=⌊INT\_MAX10⌋ rev=INT_MAX10 时不等式必定成立。

因此判定条件可简化为:当且仅当 r e v ≤ ⌊ I N T _ M A X 10 ⌋ rev≤⌊INT\_MAX10⌋ revINT_MAX10 时,不等式成立。

x < 0 x<0 x<0 的情况类似,留给读者自证,此处不再赘述。

综上所述,判断不等式

− 2 31 ≤ r e v ⋅ 10 + d i g i t ≤ 2 31 − 1 −2^{31}≤rev⋅10+digit≤2^{31}−1 231rev10+digit2311
是否成立,可改为判断不等式

⌈ − 2 3 1 10 ⌉ ≤ r e v ≤ ⌊ 2 31 − 1 10 ⌋ ⌈\frac{−2^31}{10}⌉≤ rev ≤⌊\frac{2^{31}−1}{10}⌋ 10231rev102311
是否成立,若不成立则返回 0。

Python
 def reverse(self, x: int) -> int:INT_MIN, INT_MAX = -2**31, 2**31 - 1rev = 0while x != 0:# INT_MIN 也是一个负数,不能写成 rev < INT_MIN // 10if rev < INT_MIN // 10 + 1 or rev > INT_MAX // 10:return 0digit = x % 10# Python3 的取模运算在 x 为负数时也会返回 [0, 9) 以内的结果,因此这里需要进行特殊判断if x < 0 and digit > 0:digit -= 10# 同理,Python3 的整数除法在 x 为负数时会向下(更小的负数)取整,因此不能写成 x //= 10x = (x - digit) // 10rev = rev * 10 + digitreturn rev
C++
int reverse(int x) 
{int rev = 0;while (x != 0) {if (rev < INT_MIN / 10 || rev > INT_MAX / 10) {return 0;}int digit = x % 10;x /= 10;rev = rev * 10 + digit;}return rev;
}
复杂度分析
  • 时间复杂度: O ( l o g ∣ x ∣ ) O(log∣x∣) O(logx)。翻转的次数即 x x x 十进制的位数。
  • 空间复杂度: O ( 1 ) O(1) O(1)

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

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

相关文章

算法设计与分析复习--贪心(二)

文章目录 上一篇哈夫曼编码单源最短路最小生成树Kruskal算法Prim算法 多机调度问题下一篇 上一篇 算法设计与分析复习–贪心&#xff08;一&#xff09; 哈夫曼编码 产生这种前缀码的方式称为哈夫曼树 哈夫曼树相关习题AcWing 148. 合并果子 #include <iostream> #inc…

【Python百宝箱】视觉算法秀:Python图像处理舞台上的巅峰对决

前言 在数字化时代&#xff0c;图像处理技术已经成为科技和计算机领域中不可或缺的一部分。从医学影像到计算机视觉&#xff0c;图像处理为我们提供了无限的可能性。Python作为一种灵活而强大的编程语言&#xff0c;在图像处理领域表现出色&#xff0c;拥有丰富的库和工具。本…

RT-Thread STM32F407 BMI088--SPI

BMI088是一款高性能6轴惯性传感器&#xff0c;由16位数字三轴24g加速度计和16位数字三轴2000/ s陀螺仪组成。 这里用SPI来驱动BMI088进行数据解读 第一步&#xff0c;首先在 RT-Thread Settings中进行配置 第二步&#xff0c;退出RT-Thread Settings&#xff0c;进入board.h…

Linux|僵死进程

1.僵死进程产生的原因或者条件: 什么是僵死进程? 当子进程先于父进程结束,父进程没有获取子进程的退出码,此时子进程变成僵死进程. 简而言之,就是子进程先结束,并且父进程没有获取它的退出码; 那么僵死进程产生的原因或者条件就是:子进程先于父进程结束,并且父进程没有获取…

C#异常捕获try catch详细介绍

在C#中&#xff0c;异常处理是通过try、catch、finally和throw语句来实现的&#xff0c;它们提供了一种结构化和可预测的方法来处理运行时错误。 C#异常基本用法 try块 异常处理以try块开始&#xff0c;try块包含可能会引发异常的代码。如果在try块中的代码执行过程中发生了…

基于卡尔曼滤波实现行人目标跟踪

目录 1. 作者介绍2. 目标跟踪算法介绍2.1 目标跟踪背景2.2 目标跟踪任务分类2.3 目标跟踪遇到的问题2.4 目标跟踪方法 3. 卡尔曼滤波的目标跟踪算法介绍3.1 所用数据视频说明3.2 卡尔曼滤波3.3 单目标跟踪算法3.3.1 IOU匹配算法3.3.2 卡尔曼滤波的使用方法 3.4 多目标跟踪算法 …

rocketmq 安装dashboard1.0.0 mq消息控制台安装 rocketmq控制台安装 rocketmq-dashboard-1.0.0编译安装

1. 官网&#xff1a; 下载 | RocketMQ 2. dashboard安装包位置&#xff1a; 在连接最下面&#xff0c;点击download.zip即可 3. 需要安装maven, 编译命令&#xff1a; mvn clean install -U -Dmaven.test.skiptrue4. 启动jar: java -jar rocketmq-dashboard-1.0.0.jar &…

在线随机字符串生成工具

具体请前往&#xff1a;在线随机字符串生成器--通过该工具生成动态复杂随机密码,随机字符串等&#xff0c;加密盐等

Leetcode—141.环形链表【简单】

2023每日刷题&#xff08;三十三&#xff09; Leetcode—141.环形链表 快慢指针算法思想 关于快慢指针为什么能检测出环&#xff0c;可以这么思考。 假设存在一个环: 慢指针进入环后&#xff0c;快指针和慢指针之间相距为d&#xff0c;每一次移动&#xff0c;d都会缩小1&…

【项目设计】网络版五子棋游戏

文章目录 一、项目介绍1. 项目简介2. 开发环境3. 核心技术4. 开发阶段 二、环境搭建1. 安装 wget 工具2. 更换 yum 源3. 安装 lrzsz 传输工具4. 安装⾼版本 gcc/g 编译器5. 安装 gdb 调试器6. 安装分布式版本控制工具 git7. 安装 cmake8. 安装 boost 库9. 安装 Jsoncpp 库10. 安…

iOS线程

1.任务、线程、队列 每一个要执行的操作都是任务&#xff1a;比如说函数 一个队列中可以放很多个线程&#xff0c;一个线程中有很多个任务 可以这样看&#xff1a;有一个办事所&#xff08;队列&#xff09;&#xff0c;所里有很多窗口&#xff08;线程&#xff09;&#xff0c…

DM8共享集群DSC初始化DB实例报错

DM8共享集群DSC初始化DB实例报错 问题描述 启动dmcss和dmasmsvr服务启动后&#xff0c;初始化DB实例提示如下报错&#xff1a; [dmdbalocalhost DSC0]$ /dmdb8/dmdbms/bin/dminit control/dmdb8/dmdbms/dsc_config/DSC0/dminit.ini initdb V8 db version: 0x7000c file dm.k…

[AI]ChatGPT4 与 ChatGPT3.5 区别有多大

ChatGPT 3.5 注册已经不需要手机了&#xff0c;直接邮箱认证就可以&#xff0c;这可真算是好消息&#xff0c;坏消息是 ChatGPT 4 还是要收费。 那么 GPT-3.5 与 GPT-4 区别有多大呢&#xff0c;下面简单测试一下。 以从 TDengine 订阅数据为例&#xff0c;TDengine 算是不太小…

Appium自动化测试:通过appium的inspector功能无法启动app的原因

在打开appium-desktop程序&#xff0c;点击inspector功能&#xff0c;填写app的配置信息&#xff0c;启动服务提示如下&#xff1a; 报错信息&#xff1a; An unknown server-side error occurred while processing the command. Original error: Cannot start the cc.knowyo…

专业数据标注公司:景联文科技领航数据标注行业,满足大模型时代新需求

随着大模型的蓬勃发展和相关政策的逐步推进&#xff0c;为数据要素市场化配置的加速推进提供了有力的技术保障和政策支持。数据要素生产力度的不断提升&#xff0c;为数据标注产业带来了迅速发展的契机。 根据国家工信安全发展研究中心测算&#xff0c;2022年中国数据加工环节的…

leetcode (力扣) 201. 数字范围按位与 (位运算)

文章目录 题目描述思路分析完整代码 题目描述 给你两个整数 left 和 right &#xff0c;表示区间 [left, right] &#xff0c;返回此区间内所有数字 按位与 的结果&#xff08;包含 left 、right 端点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;left 5, right 7 输出…

c# 字符串转换为byte

c# 字符串转换为byte using System.Text; class proj {internal static void Main(string[] args){byte[] anew byte[3];Console.WriteLine("打印a");Console.WriteLine("a的长度{0}",a.Length);foreach (byte b in a){ Console.WriteLine(b); }a Encodi…

linux系统环境下mysql安装和基本命令学习

此篇文章为蓝桥云课--MySQL的学习记录 块引用部分为自己的实验部分&#xff0c;其余部分是课程自带的知识&#xff0c;链接如下&#xff1a; MySQL 基础课程_MySQL - 蓝桥云课 本课程为 SQL 基本语法及 MySQL 基本操作的实验&#xff0c;理论内容较少&#xff0c;动手实践多&am…

发现区块链世界的新大门——AppBag.io DApp导航网站全面解析

随着区块链技术的飞速发展&#xff0c;分布式应用&#xff08;DApp&#xff09;个充满创新和可能性的领域里&#xff0c;appbag.io DApp导航网站应运而生&#xff0c;为您打开探索区块链世界的新大门。 区块链应用的集大成者 AppBag.io DApp导航网站不仅是一个DApp的集散地&a…

muduo源码剖析之TcpServer服务端

简介 TcpServer拥有Acceptor类&#xff0c;新连接到达时new TcpConnection后续客户端和TcpConnection类交互。TcpServer管理连接和启动线程池&#xff0c;用Acceptor接受连接。 服务端封装 - muduo的server端维护了多个tcpconnection 注意TcpServer本身不带Channel&#xff0…