由于这两道题采用相同的思路,所以放在一起写。
回文数
问题描述
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
- 示例 1:
输入: 121
输出: true- 示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。- 示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number
思路
首先将数字换变为字符串,把字符串的每个字符放在一个列表中。然后生成一个新列表,列表各元素是前一个列表的倒序,如果这两个列表相等,则该数字是回文数。
官方提示是:Beware of overflow when you reverse the integer.
我看不懂这个提示…
代码及结果
代码
class Solution(object):
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
ls_1=list(str(x))
ls_2=[]
for i in range(len(ls_1)-1,-1,-1):
ls_2.append(ls_1[i])
if ls_1 == ls_2 :
return True
else:
return False
结果
执行用时 :64 ms, 在所有 python 提交中击败了51.26%的用户
内存消耗 :11.7 MB, 在所有 python 提交中击败了25.86%的用户
整数反转
问题描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
(PS:再次注意是反转后整数溢出)
- 示例 1:
输入: 123
输出: 321- 示例 2:
输入: -123
输出: -321- 示例 3:
输入: 120
输出: 21
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
思路
和回文数字用到的方法一样,同样用两个列表来解决。但是存在以下问题:
- 储存反转后的列表如何转换成整数
- 判断给定数字是否为负的条件放在哪里
- 何时应该return 0
代码及结果
代码
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
if x < 0:
a= -x
else:
a=x
ls_1=list(str(a))
ls_2=[]
for i in range (len(ls_1)-1, -1, -1):
ls_2.append(ls_1[i])
ls=''.join(ls_2)
if int(ls) <= -2 **31 or int(ls) >= 2**31-1 :
return 0
if x > 0:
return int(ls)
else :
return -int(ls)
结果
执行用时 :16 ms, 在所有 python 提交中击败了93.27%的用户
内存消耗 :11.6 MB, 在所有 python 提交中击败了35.12%的用户
用时很短比较出乎意料。与移除元素那个问题结合起来可以发现,检索列表用时很短,但是增删列表需要花不少时间(具体原因需要进一步的学习)。
总结
- 关于正负数:python中的abs()函数可以获得一个数的绝对值。
- 关于列表转换成整数:需要用"".join() 函数。括号里是列表,“”中如果没有则是将列表中所有元素连起来,如果是某字符,则将是将所有元素用该字符连起来。
- 还可以用列表的reverse函数来做:
回文数:
class Solution(object):
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
if x < 0:
return False
ls=list(str(x))
ls.reverse()
y=int(''.join(ls))
if x == y:
return True
else:
return False
结果:
执行用时 :68 ms, 在所有 python 提交中击败了41.89%的用户
内存消耗 :11.7 MB, 在所有 python 提交中击败了26.87%的用户
整数反转:
class Solution(object):
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
if x < 0:
return False
ls=list(str(x))
ls.reverse()
y=int(''.join(ls))
if x == y:
return True
else:
return False
结果:
执行用时 :12 ms, 在所有 python 提交中击败了98.12%的用户
内存消耗 :11.7 MB, 在所有 python 提交中击败了23.86%的用户
从结果上比较两种方法差别不大,但reverse写起来更方便。