LeetCode-7 整数反转

题目:整数反转

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

1
2
输入: 123
输出: 321

示例 2:

1
2
输入: -123
输出: -321

示例 3:

1
2
输入: 120
输出: 21

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [$-2^{31}, 2^{31}-1$]。请根据这个假设,如果反转后整数溢出那么就返回 0。

思路

对于反转,python中对于列表有内建的反转函数,可以直接调用

  • 初始化flag用于确认输入x是正数还是负数,如果是负数将其变成正数
  • 将x转换为string,再转换为list
  • 调用list.reverse()进行反转
  • 合并list的值,并转换为string,再转换为int
  • 根据flag确认是否增加正负号
  • 判断最终结果是否超出范围,超出则返回0

实现:

1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def reverse(self, x: int) -> int:
flag = True
if x < 0:
flag = False
x *= -1
out = list(str(x))
out.reverse()
out = int(''.join(out)) if flag else int(''.join(out)) * -1
if -2 ** 31 < out < 2 ** 31 - 1:
return out
return 0

优化方法

上述方法调用了list的内建函数,但是涉及两次类型转换int -> string -> list,list -> string -> int。

直接进行计算反转会快一些。

  • 初始化flag用于确认输入x是正数还是负数,如果是负数将其变成正数
  • 初始化结果out=0
  • 进入循环迭代
    • 取个位数:pop = x % 10
    • 将x值删除个位:x \\= 10
    • 计算当前的结果: out = out * 10 + pop
  • 根据flag确认是否增加正负号
  • 判断最终结果是否超出范围,超出则返回0

实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution:
def reverse(self, x: int) -> int:
flag = True
out = 0
if x < 0:
flag = False
x *= -1
while x:
pop = x % 10
x //= 10
out = out * 10 + pop
out = out if flag else -1 * out
if -2 ** 31 < out < 2 ** 31 - 1:
return out
return 0

如果大家有更好的方法,欢迎一起探讨。