一、写在前面
之前写过的Leetcode笔记:点击查看
今天给大家分享的是LeetCode 009:整数反转,为面试而生,期待你的加入。
二、今日题目
判断一个整数是否是回文数。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例:
输入: 121
输出: true
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
三、 分析
这个题目看着不怎么难,思路和上一题有点像,就我的个人认知来说,这个题主要考察点在:对回文数的认知和遍历优化上,前者,所谓回文数,即这个数正着读和反着读都是相同的,如,2019102
,反过来还是2019102
;后者,看重方法。
四、解题
- 我的方法:
int
转变为str
,然后遍历字符串(Python里int是不可迭代的,所以得转换一下),循环比较首尾是否相等。
# -*- coding: utf-8 -*-
"""
@author = 老表
@date = 2019-08-31
@个人公众号 : 简说Python
"""
class Solution:
def isPalindrome(self, x: int) -> bool:
# int 转变成 str
x = str(x)
# 字符串长度
l = len(x)
# 遍历比较首尾
for i in range(l):
# 相等继续往后遍历
if x[i] == x[l-i-1]:
continue
else:
# 不相等,说明不是回文数,返回 False
return False
# 顺利遍历结束,则返回True
return True
执行结果:
修改一下,
1、对于负数,肯定不是回文数,因为有负号
2、不转为str,自己取数逆置,比较
# -*- coding: utf-8 -*-
"""
@author = 老表
@date = 2019-08-31
@个人公众号 : 简说Python
"""
class Solution:
def isPalindrome(self, x: int) -> bool:
if x < 0:
return False
y = 0
temp = x
# 逆转数
while temp != 0:
pop = temp % 10 # 取出低位
temp = temp // 10 # 取出剩余数
y = y * 10 + pop # 重新组装,低位变成高位
if x != y:
return False
# 相等返回True
return True
- 方法二:通过之前的学习,我们知道,一些top级的代码都是使用了内置函数的,或者特殊语法,对于这题,我们也可以试试,毕竟回文数的核心在于:逆置前后相等,关键在逆置。
Python里逆置字符串的方法,除了for遍历外,最好用的方法就是切片。
str[x:y:n]
str :字符串对象
x :起始位置(可以取到)
y :末尾(结束)位置(取不到)
n :步进(隔多远取一个数,-1表示从末尾开始取)
例如:
str = "1234"
str[1:3:1]
结果:"23"
str[0:4:2]
结果:"13"
str[::-1]
结果:"4321"
# -*- coding: utf-8 -*-
"""
@author = 老表
@date = 2019-08-31
@个人公众号 : 简说Python
"""
class Solution:
def isPalindrome(self, x: int) -> bool:
if x < 0:
return False
# 转变为字符串,切片逆置,转变为整数,比较
if x == int(str(x)[::-1]):
return True
return False
- 提交结果
五、疑惑
自从上次发现Leetcode 提交后可以查看其他解决方案,我每次做完就会看看top级的解决方法,这里分享给大家。
都用了切片来处理逆置问题,不可否认,这的确比我们自己手动处理要快很多。
六、结语
坚持就完了。