文章目录

  • 1:问题描述
  • 2:问题分析
    • 2.1 时间复杂度和空间复杂度
    • 2.2 列表法
      • 2.2.1 代码
    • 2.3 数学解析法
      • 2.3.1 代码

1:问题描述

来源:LeetCode

难度:中等


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

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

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


2:问题分析

2.1 时间复杂度和空间复杂度

在真正开始介绍各种算法前,先以表格形式展示各自的时间复杂度和空间复杂度:

算法 时间复杂度 空间复杂度
列表法 O(log(x))O(log(x))O(log(x)) O(log(x))O(log(x))O(log(x))
数学解析法 O(log(x)log(x)log(x)) O(1)O(1)O(1)

2.2 列表法

题目本身强调了不允许使用64位的类型,因此当反转后数值超过 32位数能够表达的[−231,231−1][−2^{31},2^{31} − 1][−231,231−1] 范围,也就无法直接使用int类型表达。这是比较麻烦的一点,否则可以直接使用转为字符串类型,然后再反向切片然后转为int即可。

  1. 使用列表从低位到高位依次存储x中的每一位的数值。
  2. 然后使用同样的操作存储界限值
  3. 首先比较两者的长度,如果x对应的反转列表长度较短,直接转换回int类型
  4. 如果两者长度相等,则从高位到低位依次对比数值大小,如果x对应的数较小,则转换为int类型返回;如果x对应的数较大,说明数值溢出了,返回0.

2.2.1 代码

def reverse(x: int) -> int:sign = 1if x < 0:sign = -1def get_list(x):x_list = []while x:x, t = divmod(x, 10) # 与 x = x // 10, t= x%10等价x_list.append(t)return x_listdef get_int(x_list):x = 0for i, item in enumerate(x_list):x += item * 10 ** (len(x_list) - i - 1)return xx = abs(x)x_list = get_list(x)  # 反转后的数值列表,因为转换为列表时出来的就是反的if sign == 1:top_list = get_list(2 ** 31)[::-1]  # 正常的边界值 + 1else:top_list = get_list(2 ** 31 + 1)[::-1]# 如果长度没有上限的大,那么不用担心这个反转后的数值超过边界值if len(x_list) < len(top_list):return get_int(x_list) * sign# 如果长度相等,那么就需要考虑是否超过界限:# 如果数值相等,那么说明刚好超过界限,直接返回0# 如果数值不等,那么就需要依次比较高位的数,如果有反转后的数值有高位大于界限,那么返回0# 如果高位小于界限,那么直接返回反转后的数值×符号位# 如果高位相等,则比较后边的高位值elif len(x_list) == len(top_list):if x_list == top_list:return 0for m, n in zip(x_list, top_list):if m > n:return 0elif m < n:return get_int(x_list) * sign

对于时间复杂度,因为int类型的数值长度l=int(log⁡10(x))+1l=int(\log _{10}\left( x\right))+1l=int(log10​(x))+1计算得到,所以列表创建和遍历的时间复杂度为O(log(x))O(log(x))O(log(x)),因此该算法的时间复杂度为O(log(x))O(log(x))O(log(x))

空间复杂度同样为O(log(x))O(log(x))O(log(x))

2.3 数学解析法

虽然上述算法通过列表,避免了直接生成可能溢出的结果值,但是列表法的空间复杂度较高。

在介绍数学解析法之前,我们先考虑一个正数的不会溢出的情况。
假设x=123x=123x=123,那么反转的流程则是:

  1. 123//10=12,123%10=3123 // 10 = 12, 123 \% 10 = 3123//10=12,123%10=3
  2. 0∗10+3=30*10+3=30∗10+3=3
  3. 12//10=1,12%10=212//10=1, 12 \% 10=212//10=1,12%10=2
  4. 3∗10+2=323 * 10 + 2 = 323∗10+2=32
  5. 1//10=0,1%10=11//10=0,1\%10=11//10=0,1%10=1
  6. 32∗10+1=32132 * 10 + 1=32132∗10+1=321

代码如下所示:

rev = 0
while x:x, t = divmod(x, 10) # 上述流程中的1、3、5步骤rev = rev * 10 + t #上述流程中的2、4、6步骤

同样以正数为例:
如果要保证反转后的数值不溢出,那么就需要最后一次执行的rev∗10+t<=INT_MAXrev * 10 + t<= INT\_MAXrev∗10+t<=INT_MAX,这里INT_MAX=231−1INT\_MAX=2^{31}-1INT_MAX=231−1.

我们将INT_MAXINT\_MAXINT_MAX转换为如下形式:
INT_MAX=⌊INT_MAX10⌋×10+7INT\_MAX=\lfloor \dfrac{INT\_MAX}{10}\rfloor ×10 + 7INT_MAX=⌊10INT_MAX​⌋×10+7

那么需要:
rev∗10+t<=⌊INT_MAX10⌋×10+7rev * 10 + t<= \lfloor \dfrac{INT\_MAX}{10}\rfloor ×10 + 7rev∗10+t<=⌊10INT_MAX​⌋×10+7
经过简单的变换后:
(rev−⌊INT_MAX10⌋)∗10<=7−t(rev-\lfloor \dfrac{INT\_MAX}{10}\rfloor) * 10 <= 7-t(rev−⌊10INT_MAX​⌋)∗10<=7−t

  • 当rev>⌊INT_MAX10⌋rev>\lfloor \dfrac{INT\_MAX}{10}\rfloorrev>⌊10INT_MAX​⌋时,左边的数值>=10>=10>=10,而右边的0=<t<=90=<t<=90=<t<=9,因此7−t<107-t<107−t<10,所以这个不等式是不成立的;
  • 当rev=⌊INT_MAX10⌋rev=\lfloor \dfrac{INT\_MAX}{10}\rfloorrev=⌊10INT_MAX​⌋时,左边的数值=0=0=0,而右边的0=<t<=70=<t<=70=<t<=7时不等式成立,同时可以考虑下,rev=⌊INT_MAX10⌋rev=\lfloor \dfrac{INT\_MAX}{10}\rfloorrev=⌊10INT_MAX​⌋,这个xxx的长度应该和INT_MAXINT\_MAXINT_MAX是相同的,而最后一次的ttt则是xxx的最高位,根据题意其是t=1,2t=1,2t=1,2的,所以这个等式是必然成立的。
  • 当rev<⌊INT_MAX10⌋rev<\lfloor \dfrac{INT\_MAX}{10}\rfloorrev<⌊10INT_MAX​⌋时,左边的数值<=−10<=-10<=−10,而右边的0=<t<=90=<t<=90=<t<=9,因此−2=<7−t<=7-2=<7-t<=7−2=<7−t<=7,所以这个不等式是成立的;

因此通过以上的分析,当rev<=⌊INT_MAX10⌋rev<=\lfloor \dfrac{INT\_MAX}{10}\rfloorrev<=⌊10INT_MAX​⌋时,反转后的数值不会溢出;反之,当rev>⌊INT_MAX10⌋rev>\lfloor \dfrac{INT\_MAX}{10}\rfloorrev>⌊10INT_MAX​⌋时,反转后的数值会溢出。

2.3.1 代码

因为INT_MAX=231−1INT\_MAX = 2 ^{31} -1INT_MAX=231−1, 而xxx的下限INT_MIN=−231INT\_MIN=-2^{31}INT_MIN=−231.
而⌊INT_MAX10⌋=⌊∣INT_MIN∣10⌋\lfloor \dfrac{INT\_MAX}{10}\rfloor=\lfloor \dfrac{|INT\_MIN|}{10}\rfloor⌊10INT_MAX​⌋=⌊10∣INT_MIN∣​⌋,所以我们直接使用rev>⌊23110⌋rev>\lfloor \dfrac{2^{31}}{10}\rfloorrev>⌊10231​⌋作为数值溢出的判断条件。

同时首先得到符号值,然后取绝对值,将正数和负数的情况统一为正数情况处理。

def reverse2(x: int) -> int:rev = 0sign = 1max_rev = 2 ** 31 // 10if x < 0:sign = -1x = abs(x)while x:if rev > max_rev:return 0x, t = divmod(x, 10)rev = rev * 10 + treturn rev * sign

时间复杂度同样是O(log(x))O(log(x))O(log(x)),而空间复杂度则只是O(1)O(1)O(1)级别的。

LeetCode 第7题:整数反转(Python3解法)相关推荐

  1. leetcode第七题整数反转

    leetcode第七题: 提示:这里简述项目相关背景: 挑一题简单一点的试试手 问题描述: 原因分析: 提示:这里填写问题的分析: 通过了1031个案例应该是边界问题 解决方案: 提示:先改改待会来补 ...

  2. LeetCode题组:第7题-整数反转

    题目:整数反转 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: ...

  3. leetcode 两数之和 整数反转 回文数 罗马数字转整数

    1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个 ...

  4. LeetCode刷题: 整数反转

    题目 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转.示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意: ...

  5. LeetCode刷题——整数反转

    目录 一.题目描述 二.题解 三.源码 一.题目描述 二.题解 三.源码 class Solution:def reverse(self, x: int) -> int:if -10 < ...

  6. leedcode刷题——整数反转

    给你一个 32 位的有符号整数 x ,返回 x 中每位上的数字反转后的结果. 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0. 示例 1: 输入:x = ...

  7. 【LeetCode笔记】7.整数反转(Java、溢出判断、栈)

    文章目录 题目描述 解法 & 代码 ① 字符串解法 ② 类栈做法 题目描述 边界比较需要考虑,而且还有不允许64位整数的要求. 解法 & 代码 ① 字符串解法 起初想到的做法,不过缺点 ...

  8. 20191211——第七题 整数反转

    这套题卡了很久,实在不会看到题解才明白错的原因,原因就在于这个会不会溢出,可能一开始的数组并没有溢出计算机的范围pow(2,31) ,但是当你反转之后你就有可能进行溢出,所以你需要进行判断. 方法其实 ...

  9. [剑指offer][JAVA]面试题第[14-1、2]题[剪绳子][Leetcode][第343题][整数拆分][数学][动态规划][背包]

    [问题描述][中等] 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m.n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] .请问 k[ ...

  10. LeetCode第12题 整数转罗马数字

    /* 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为 ...

最新文章

  1. 参加第二届中国网络营销行业大会会议记录
  2. Windows Server 2008 R2之十一Windows Server Backup
  3. 忘记手机绑定过的UC/交易猫账号怎么找回
  4. java序列化错在哪里_Spark序列化错误:java.io.NotSerializableException
  5. PHP与mysql的基础知识
  6. 给程序员的10条建议,吐血推荐!
  7. 怎么批量调色_100款一键批量商业影楼修图调色PS动作,让你成为P图高手!!
  8. oracle函数整理---first_value函数
  9. 【多目标进化优化】MOEA 的分类
  10. 无法同步谷歌日历_安卓手机的日历App之选择、使用(附记:纪念日App)
  11. linux jq下载文件,linux 之 jq
  12. 图解系统(六)——调度算法
  13. echarts地图api series_百度地图2.0离线版与echarts结合
  14. 汇编学习笔记-输出月份缩写
  15. 【Hbase】(十一)详解 HBase 表的设计原则
  16. css去掉ie浏览器输入框后面的小叉叉,和密码框后面的小眼睛
  17. 安装CentOS 5.x与多重引导小技巧(鸟哥的Linux私房菜 基础篇)
  18. abaqus黑盒猜测和理论学习: S4R 单元的实现方式 板壳、梁理论
  19. 浅谈表面反射——波动光学篇
  20. 使用SWFUpload上传文件

热门文章

  1. Grafana 导出所有dashboard
  2. PXC SST 同步异常trabackup_checkpoints missing. xtrabackup/SST failed on DONOR. Check DONOR log
  3. Win系统 - 浅谈笔记本散热系统
  4. ELSA为其英语发音助理筹集320万美元pre-A轮融资
  5. 根据一堆数字判定下一个数字_坐在一堆数字黄金
  6. Token的基本介绍
  7. 关爱青少年作品,灯塔
  8. 浅谈企业信息化建设的整体规划
  9. xp下,输入法不能删除,也不能添加(所有添加和删除的按钮都为灰色)的解决方法
  10. 汉寿计算机培训初中升高中,升高中前,这几类学生只需注意这些,就有机会成为学霸...