题目
题目来源
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为[−231, 231 − 1](231=2147483648)。请根据这个假设,如果反转后整数溢出那么就返回 0。
示例
输入: 123 # 正数反转
输出: 321
输入: -123 # 负数反转
输出: -321
输入: 120 # 数字反转后为021,整数结果为21
输出: 21
输入: 8098109383 # 反转后为3839018908,结果溢出
输出: 0
解法一
解题思路:关于整数反转问题主要涉及三个问题,
- 负数只反转数字部分,不带负号;
- 若给定的整数最末几位全为0,反转后则忽略不存在,例如:1200 —> 21;
- 反转后的整数是否溢出。
整数反转先将整数转化为字符串,再通过字符串切片逆序输出,得到反转后的字符串,最后将字符串转化为整数返回。(此种方法无需考虑问题2)
代码如下:
class Solution:
def reverse(self, x: int) -> int:
y = str(x) # 将整数转化为字符串
"""反转字符串"""
if x >= 0:
z = y[::-1] # x为非负数则直接切片反转
res = int(z) # 字符串转整数
elif x < 0:
L = -len(y)
z = y[-1:L:-1] # x为负数则只反转索引0位置后的字符
res = -int(z) # 字符串转整数
"""判断反转后的整数是否溢出"""
if res < -2**31 or res > 2**31 - 1:
return 0 # 如果反转后的结果溢出,则返回0
else:
return res # 否则返回结果
解法二
解题思路:整数对10循环取余,将余数依次存成字符串,最后将字符串转化为整数。
代码如下:
class Solution:
def reverse(self, x: int) -> int:
"""当整数为0时,直接返回x"""
if x == 0:
return 0
"""整数对10取余"""
X = abs(x)
res = ''
while X != 0:
rem = X % 10 # 整数对10取余
res += str(rem) # 将余数存为字符串
X //=10 # 整数对10取整
"""字符串转数字"""
if x < 0:
res = -int(res)
else:
res = int(res)
"""判断是否溢出"""
if res < -2**31 or res > 2**31-1:
return 0
return res
下面为思路类似,但更简短的代码:
代码来源
class Solution:
def reverse(self, x: int) -> int:
y, res = abs(x), 0
of = (1 << 31) - 1 if x > 0 else 1 << 31 # 整数范围[−2^31^, 2^31^ − 1]
while y != 0:
res = res * 10 + y % 10 # 整数反转的关键语句
if res > of: return 0
y //= 10
return res if x > 0 else -res
另外
上述解法虽执行时间较短,但消耗的内存较大。代码在内存消耗方面尚有大的改进空间。
若有不足或更好解法,后续补充。