我们先给出题目:
由于题目中注明了:假设环境不允许存储 64 位整数(有符号或无符号),但是笔者在评论区看到有很多的方法是采用其他语言(比如C语言)的截断功能做的,或者是对于python3这种对于int类型没有长度限制的直接使用比较功能,我觉得对于题目来说是不太严谨的做法,下面提供一个我python3的做法,供大家批评指正。
这里我们需要考虑两个要点:
1.第一个是反转过来之后这个数仍然最大不会超过2^31所能代表的十进制位数,也就是10位
2.第二个就是反转之后的数前面可能会有若干个0,那么我们需要将其去掉,然后把做完上述处理之后的字符串和2^31对应的十进制字符串作比较
下面是整体的代码:
class Solution:
def reverse(self, x: int) -> int:
# 先处理为0的情况,我们把它拿出来单独讨论
if x == 0:
return 0
# 先将数字转换成字符串
str1 = str(x)
number1 = "2147483647" # 代表的是2^31 - 1
number2 = "2147483648" # 代表的是2^31
# 对应x为负数的情况
if x < 0:
# 先使用切片的方式把数字的部分颠倒过来
str1 = str1[1:][::-1]
# 我们把前面所有的0都给切除掉了
i = 0
while str1[i] == '0':
i += 1
str1 = str1[i:]
# 由于之前的分析str1的长度只可能是10位或者更少的位数
# 所以当是10位的时候我们需要和下界number1做比较,小于10位就不用比较了
if len(str1) < 10:
return int("-" + str1)
else:
for i in range(10):
if int(str1[i]) - int(number2[i]) < 0:
return int("-" + str1)
elif int(str1[i]) - int(number2[i]) > 0:
return 0
else:
continue
# 对应x为正数的情况(大致过程和上面一致,只有细微的差别,就不一行行注释了)
else:
str1 = str1[::-1]
i = 0
while str1[i] == '0':
i += 1
str1 = str1[i:]
if len(str1) < 10:
return int(str1)
else:
for i in range(10):
if int(str1[i]) - int(number2[i]) < 0:
return int(str1)
elif int(str1[i]) - int(number2[i]) > 0:
return 0
else:
continue