来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
class Solution(object):
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
string = str(x) # 数字转换为字符串
if len(string) == 1: # 一个数字肯定是回文数
return True
for i in range(len(string)):
if string == string[::-1]: # 判断是否为回文
continue
else:
return False
return True
LeetCode近期更新了,更方便地查看提交记录和执行用时,内存消耗,这个功能挺不错的。
执行用时 : 128 ms, 在Palindrome Number的Python提交中击败了100.00% 的用户
内存消耗 : 11.7 MB, 在Palindrome Number的Python提交中击败了0.25% 的用户
典型的用时间来换空间了。
本来想着看看有没有更好的算法,点开了题解,发现题解就是这个进阶方法。。
就直接把题解的方法改成了Python
思路是这样的:
输入
1221
,我们可以将数字“1221”
的后半部分从“21”
反转为“12”
,并将其与前半部分“12”
进行比较,因为二者相同,我们得知数字1221
是回文
1.思路是这样的很清晰,但是发现有一些情况比较特殊没法处理,例如输入x = 10
,那么前半部分和后半部分是1
和0
,用1做地板除时候就会发现出现0 == 0
的情况了,不是预想的1 != 0
那么就要排除临界情况,10, 20, 30...
等等。
2.但是要考虑到输入为类似12321
的情况了,这样会出现123 != 12
,那么很好办,就把123
做一次地板除就好啦。
No BB show code:
class Solution(object):
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
revertNum = 0
if x < 0 or (x % 10 == 0 and x != 0): # 排除临界情况
return False
while revertNum < x // 10: # 比较两个数字的大小
revertNum = revertNum * 10 + (x - x // 10 * 10)
x = x // 10
if revertNum == x or revertNum == x // 10: # 包含了类似12321这种情况
return True
return False
执行用时 : 172 ms, 在Palindrome Number的Python提交中击败了78.68% 的用户
内存消耗 : 11.8 MB, 在Palindrome Number的Python提交中击败了0.25% 的用户
嗯。。占用内存还挺大的。。。