今天看到两道很相似的题,所以就一起来谈谈吧。
一. LeetCode第7题
1. 题目

2. 题意分析
题目意思很简单,就是它会给你一个整数(正负都可能),然后让你输出这个整数的反转之后的整数,但是如果反转之后的这个数超过了[- 2^31, 2^31-1],这个范围,那么就要返回0(它给的这个整数是在这个范围内的,要判断的只是反转之后的)。这个我们本来可以用循环,将整数的每个数得到之后,利用字符串或者列表的特性,将整数逆向输出,但是这样效率就不高了。下面是我的一些思路。
3. 解法一:
利用str()方法将整数转换成字符串,然后利用字符串的切片操作来得到答案。下面是我的代码:
class Solution(object):
def reverse(self, x):
upper_limit = 2147483647 # 上限
lower_linit = -2147483648 # 下限
if x < lower_linit or x > upper_limit: # 判断传入的数有没有超出范围
return 0
x = str(x) # 将该整数转换为字符串类型
if "-" not in x: # 判断原先的整数是否为负数,不是负数,则直接切片得到反转后的字符串
x = x[::-1]
else: # 如果是负数,那额由于转换后,我们要保证“-”还是在首位,所以切片是要排除这个负号
x = x[1:][::-1]
x = "-" + x
if int(x) < lower_linit or int(x) > upper_limit: # 判断反转后的整数有没有超出范围
return 0
return int(x)
执行结果:


时间复杂度O(n)=1。
现在来说一下其中关键的一些地方。
(1) 切片,代码中的x[::-1],就是将原字符串x做反转之后返回。
(2) 在上面,我们在else中的切片x[1:][::-1],这个意思是,因为这条判断语句执行else的话,说明传入的整数是负数,但是我们要保证待会儿返回时负号是在首位的,所以可以将利用x[1:0]将字符串第1(切片是从0开始的,所以1其实是第二个字符)到最后一位的字符得到,然后利用[::-1]得到反转的字符串,最后在这个字符串首位加上负号就可以了。
4. 解法二:
接下来要想能不能优化一下,当有循环的时候,就考虑能不能减少循环,没有循环时就看能不能减少判断语句,或者是一些多余的语句的删减。按理说,题目是默认传入的整数不会超出范围的,所以我们可以将第一个判断语句删了。
我的代码:
class Solution(object):
def reverse(self, x):
upper_limit = 2147483647
lower_linit = -2147483648
x = str(x)
if "-" not in x:
x = x[::-1]
else:
x = x[1:][::-1]
x = "-" + x
x = int(x)
if x < lower_linit or x > upper_limit:
return 0
return x
执行结果:


效果比第一种方法好很多。但是我们仅仅只是删除了一个判断语句而已,感觉挺神奇的。
5. 最优解:

这个有点没太想明白,他这个有while循环,但是时间却这么短。只能这样解释了,就是python对于简单的数学运算要比字符串的切片快很多。看来有时间得去看一下关于python中字符串、列表、字典这些东西的索引、切片等操作的是如何实现的了。
二. LeetCode第9题
1. 题目

2.解法一:
这个没什么好说的,思路还是用先转化为字符串,反转后判断是否和原来的字符串一样就可以了,注意,这个题目的意思是只要有负号,那就一定不是回文数了。
代码如下:
class Solution:
def isPalindrome(self, x):
x = str(x)
trans_x = x[::-1]
if trans_x == x:
return True
else:
return False
执行结果:
这个我试过用不转化为字符串,直接利用整数的取余等将这个整数反转,然后判断是否相等,但是不知道是我的方法不对还是什么,时间比这个要长了20多ms,所以就不展示了。
3.最优解:

这。。。。那我把我的代码改一下吧,就把最后一个else那个改了,代码如下:
class Solution:
def isPalindrome(self, x):
x = str(x)
trans_x = x[::-1]
if trans_x == x:
return True
return False
现在来看一下执行结果:


竟然快了40多ms,看来顺序结构真的比判断语句要快啊。
总结:
一般来说,还是要尽可能的减少循环次数,在循环次数不能再减的时候,要考虑顺序结构比条件判断语句要快,所以可以减少一些不必要的判断分支。另外,要抽时间看一下关于python内部执行切片、索引等操作的原理了。