您的位置:首页 > 编程语言 > Python开发

LeetCode7.python实现:整数反转问题☆

2019-02-28 20:33 633 查看

目录

问题

解题思路

python具体实现

题外话

问题

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

示例 1:

[code]输入: 123
输出: 321

 示例 2:

[code]输入: -123
输出: -321

示例 3:

[code]输入: 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具体实现

[code]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值判断,代码进行调整后,忽视所致的错误;第三次就是注意事项的忽视所致。第四次正确提交。如下的两张图,为同一代码两次的执行结果图,可以发现,系统运行的快慢其实也是一个随机事件(并非随机哈),但不管怎样,精益求精,设计更快捷高效的算法,才是正途。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: