题目: 整数反转

来自智得网
跳转至: 导航、​ 搜索


整数反转

难度:中等

给你一个 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


分析

字符串法

因为需要将整数反转,所以可以借助字符串,数组或者链表对整数进行反转。

例如先将数字转换为字符串,

然后将字符串的从末尾到开头依此取出每一个字符,将字符转为数字。

循环中每一轮都将上一轮的结果乘以10之后加上本轮转换的数字。

字符串循环结束之后就得出了反转的结果。

数学法

整数反转的过程是将数字的低位数字转换为高位数字,而将高位数字转换为低位数字。

例如123,先通过对123进行除10运算,商为12而余数是3,3作为结果的最高位已经确定。

继续对上一次操作的商12进行除10运算,得到的商是1,余数是2,然后上一轮运算的结果3进行乘以10的操作在加上本轮的余数2就是32。

继续上述流程对1进行除10的运算,商是0,余数是1,对一轮的结果32进行乘以10的操作再加上1,因为上一轮操作的商已经是0,操作结束,最终结果是321。

所以转换的过程是一个循环的过程,循环过程是数字的位数,每次循环操作是将数字处以10,分别得到商和余数,第一次操作之后将余数作为本轮的结果,商作为下一轮的输入,之后的操作,上一轮的结果乘以10加上本轮的余数作为本轮结果,商依然作为下一轮的输入,直到商为0结束循环。

循环的过程第一次对x进行除以10的操作,后续每次都上一轮除法运算的商进行除以10的操作,直到得出的商为0循环结束。

循环过程的时间复杂度是O(n)。

空间复杂度因为存储了反转之后的数字,空间复杂度也是O(n)。

溢出检查

但是因为整数的范围限制,只能存储-231~231-1之间的数字,所以无论采用何种算法,都需要处理溢出的问题,假如使用数学运算法循环中上一轮的结果是n,本轮的余数是p,本轮操作中n乘10加p的操作可能会出现溢出。溢出分为下面几种情况:

所以在循环中出现这几类情况结果直接是0。

通过循环过程中判断是否溢出可以处理溢出的情况,但是逻辑较为复杂,可以利用溢出的特性,如果不溢出的话将操作回滚(比如对乘以10加上5进行减去5在除以10的操作)可以恢复原值,如果溢出则不可以,判断值是否溢出,一旦溢出则直接将结果置为0。

题解

字符串法