7. Reverse Integer 整数反转
难度: Easy
刷题内容
原题连接
- https://leetcode.com/problems/Reverse-Integer
- https://leetcode-cn.com/problems/reverse-integer
内容描述
给定一个 32 位有符号整数,将整数中的数字进行反转
> 示例 1:
输入: 123
输出: 321
> 示例 2:
输入: -123
输出: -321
> 示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31, 2^31 − 1]
根据这个假设,如果反转后的整数溢出,则返回 0
解题方案
- 翻转数字问题需要注意的就是溢出问题,为什么会存在溢出问题呢
- 我们知道int型的数值范围是: -2147483648~2147483647(-2^31 ~ 2^31-1)
- 那么如果我们要翻转 1000000009 这个在范围内的数得到 9000000001,而翻转后的数就超过了范围
思路1
- 记录符号
- 将数字当字符串处理
- 判断是否阈值区间,进行比较就行
class Solution:
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
mark = 1 if x>=0 else -1
x_abs = abs(x)
result = mark * int(str(x_abs)[::-1])
return result if -2**31 <= result <= 2**31-1 else 0
if __name__ == "__main__":
num = -12395
so = Solution()
n = so.reverse(num)
print("结果: ", n)
思路2
如果输入的是负数,就递归调用原函数,参数变成-x即可
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
if x < 0:
return -self.reverse(-x)
res = 0
while x:
res = res * 10 + x % 10
x /= 10
return res if res <= 0x7fffffff else 0
思路3
按照参数正负号先将其转成字符串,然后再反转,根据是否溢出决定输出0还是反转结果
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
x = -int(str(x)[::-1][:-1]) if x < 0 else int(str(x)[::-1]) # [:-1]相当于把负号去掉
x = 0 if abs(x) > 0x7FFFFFFF else x
return x
思路4(StefanPochmann大神):
看这个解法前先看 backticks
cmp函数在python3.x中用不了了,import operator用gt或者lt吧,或者回归if/else condition爸爸的怀抱吧!
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
s = cmp(x, 0)
r = int(`s * x`[::-1])
return s * r * (r < 2 ** 31)