leetcode: 整数反转

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

注意:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer

首先,反转整数需要考虑两点,一是是否有负号,有符号需要把符号放到最前面,二是末尾有没有0,有0需要去掉,因为数字首位是不能为零的。

考虑到python取模10时结果会是正数,所以把数字转为字符处理更为方便

另外,题设假设环境只能存储得下32位int整型数字,python不需要考虑数字长度,所以我们直接用if判断数字大小

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution:
def reverse(self, x: int) -> int:
if x == 0:
return 0
str_x = str(x)
x = ''
if str_x[0] == '-':
x += '-'
x += str_x[len(str_x)-1::-1].lstrip("0").rstrip("-")
x = int(x)
if -2**31<x<2**31-1:
return x
return 0

注意到其中用了[len(str_x)-1::-1],意义是从len(str_x)开始,以-1递减的方式截取,达到反取的作用,第二位不写默认是0

lstrip方法,表示截取最左边的某个字符,多个重复全部截取

rstrip方法同上不过是截取右边


评论大佬中也有不处理为字符串的方法,就是对数字做取余处理,这里贴一下代码以供学习:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution:
def reverse(self, x: int) -> int:
# 避免python负数取模的特性,改为对正数取整
num: int = x if x > 0 else -x
ans: int = 0

MAX_VALUE = 2147483647
MIN_VALUE = -2147483648

while(num != 0):
pop: int = num % 10
if x > 0:
if (ans > MAX_VALUE // 10) or (ans == MAX_VALUE // 10 and pop > 7):
# 正溢出
return 0
elif x < 0:
if (ans > -MIN_VALUE // 10) or (ans == -MAX_VALUE // 10 and pop > 8):
# 负溢出
return 0

ans = ans * 10 + pop
num //= 10

return ans if x > 0 else -ans

想起樱木花道的经典台词:安西教练,你最光荣的时候是什么时候,是在日本国家队的时候吗?而我,只有现在了!

菜鸟坚持一天至少一篇,先从简单起,慢慢来吧。