题目:
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
方法1:
没做过题的小白做法:
#python3
class Solution:
def reverse(self, x: int) -> int:
arr= set()
def f(s:str):
if s.find('0')==0:
if len(s)==1:
return s
for i in range(1,10):
if s.find(str(i))!=-1:
arr.add(s.find(str(i)))
else:
continue
return s[list(arr)[0]:len(s)]
else:
return s
if x<=0:
x=-1*x
s=str(x)
s = s[::-1]
f(s)
a=int(s)
a=-1*a
if a<-2147483648:
return 0
else:
return a
else:
s=str(x)
s=s[::-1]
f(s)
if int(s)>2147483647:
return 0
else:
return int(s)
首先判断x是否小于零,如果小于0则先将其转化为正数,然后再转化为字符串类型,并将字符串s反转后将字符串作为参数传进reverse函数中 reverse函数判断字符串的首部是否为0,如果是0,则需要将字符串从第一个不为0的数开始一直到字符串尾部将其返回,方法是创建一个用于存放下标的数组,在s中将其找到所有不为0的下标存入数组,然后找到下标数组的最小值就是第一个不为零的正数,因为set函数会自动排序,故取出第一个元素即为最小下标。
例如5302500反转后为0052035,依次存入的下标为3 5 2 自动排序后为2 3 5即返回从第三个元素开始到字符串末尾的字符串s:52035
s=Solution()
print(s.reverse(5302500))
输出:52035
如果x为负数 则从s经过reverse函数后结果要变为负数并与题目要求的-2^31比较大小。
方法2:
看了题解后才发现用数学方法就不到10行代码能做出来:
#python3
def reverse2(self, x: int) -> int:
a = abs(x)
n = 0
while a != 0:
n = n * 10 + a % 10
a = a // 10
if n > 2147483647 or n > 2147483648:
return 0
return n if x > 0 else -n
这个做法是先取绝对值,进行取模、取整、相加运算就能轻松做出来,也不需要用数组来耗费大量空间。