目录
问题
解题思路
python具体实现
题外话
问题
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
解题思路
对10取余操作 和 对10整除操作。这里要注意一个问题:负数和正数的整除和取余结果的不同。正数的整除和取余,我们耳熟能详,但对于负数,或许会稍有疑惑,比如 -4,整除10等于-1,对10取余等于6。但是,我们希望无论是正数,还是负数,都可以进行同样的操作,而这,并不难实现。
基于此,详细步骤如下:
1)正负数的判断并将负数变为正数。假定指定的整数为X,则先判断X是正数还是负数(注意:此处我们忽略了0),若为负数,则变为正数。因此,需要一个标记,也就是来一个flag变量,默认值我们设定为False,即为正数,当flag为True时,也就表示指定值为负数,这个我们会在第三步中用到;
2)反转数的存储。这里,我用列表来存储反转数。先存储变量对10的取余值(这里,我考虑将反转数的每位数先字符存储,然后拼接成字符串,最后进行类型转换实现整数的输出,因此,在程序实现的的列表添加取余值时,用了str()进行类型转换。当然,也可以直接进行类同反转数的操作,每迭代一次,就进行之前的数乘以10并加上当前取余的值的操作来实现,不过感觉没有直接类型转换程序运行快吧),将变量变为对10整除后的值,直到变量对10整除为0为止;
3)字符串拼接,类型转换。第二步中,我们用字符列表存储了反转的每一位数,因此,现在我们要将反转后的每位数,拼接到一起了,如果flag为True,则在拼接的字符串前面,在拼接上字符'-';
4)题干注意事项的判断,结果返回。这不无须解释,按照题干的注意提醒操作即可,然后返回最终值。
python具体实现
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
# 特殊情况一 : 0值的判断,直接输出
if x==0 :
return 0
# 一般情况的调整翻转
xlist =[] # 存储反转的数字
flag = False # 默认为正数的标记
if x<0:
x = abs(x)
flag = True
while x>0:
xlist.append(str(x%10)) # 顺序存储每位反转数,注意字符形格式
x = x//10 # 整除操作
result = None # 将xlist中的字符,顺序拼接
if flag:
result = '-'+''.join(xlist)
else:
result = ''.join(xlist)
result = int(result) # 将反转的数字字符串格式转换
# 特殊情况二:反转后的溢出判断
if result >2**31-1 or result<-2**31:
return 0
else:
return result
题外话
这道题是LeetCode中标记为简单的题目,但我还是提交错了三次,第一次是忽略了0值本身的反转输出;第二次是程序填了0值判断,代码进行调整后,忽视所致的错误;第三次就是注意事项的忽视所致。第四次正确提交。如下的两张图,为同一代码两次的执行结果图,可以发现,系统运行的快慢其实也是一个随机事件(并非随机哈),但不管怎样,精益求精,设计更快捷高效的算法,才是正途。