题目: 整数反转
整数反转
给你一个 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。