7. 整数反转
题目介绍
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
思路梳理
负数取模
代码
题解1
class Solution:
def reverse(self, x: int) -> int:
# 设置int的数据范围
int_max ,int_min = 2**31-1,-2**31-1
rev = 0
while x!=0:
# 判断是否超过32位
if rev < int_min//10+1 or rev > int_max //10:
return 0
digit = x%10 # 取出最后一位
# 负数取模不一样和整数取模,这里需要判断
if x<0 and digit>0:
digit -= 10
# 同理,python负数取整会向下取整,这样先去除个位数
x = (x-digit) // 10
rev = rev*10+digit
return rev
题解2
直接转换为绝对值,好处就是不用判断整数还是负数
class Solution:
def reverse(self, x: int) -> int:
y, res = abs(x), 0
# 则其数值范围为 [−2^31, 2^31 − 1]
# 转为绝对值的最大范围
boundry = (1<<31) -1 if x>0 else 1<<31
while y != 0:
res = res*10 +y%10
if res > boundry :
return 0
y //=10
return res if x >0 else -res
题解3
转换为字符串
class Solution:
def reverse(self, x: int) -> int:
x1 = -1 if x < 0 else 1
x = str(abs(x))
x = int(x[::-1])
x = x * x1
return x if -2**31<x<2**31-1 else 0
总结
复杂度分析
时间复杂度:O(\log |x|)O(log∣x∣)。翻转的次数即 xx 十进制的位数。
空间复杂度:O(1)O(1)。