Python每日一练-----难题唯唯诺诺,易题重拳出击?(回文数)
⛅不再平躺,每日一卷(day11)
目录
题目:
题目分析:
解题思路:
常规解法:
双指针解法:
题目:
给你一个整数 x
,如果 x
是一个回文整数,返回 true
;否则,返回 false
。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
🌠示例 1:
输入:x = 121
输出:true
🌠示例 2:
输入:x = -121
输出:false
原由:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
🌠示例 3:
输入:x = 10
输出:false
原由:从右向左读, 为 01 。因此它不是一个回文数。
题目分析:
题目简单易懂,如果是负数,那就肯定不是回文数了。如果是正数就将转置(首尾颠倒),要是和原数一样就是回文数。
解题思路:
将所给的数转置后判断转置后是否和原数相同
1.转置数字
2。判断转置后数值和原数值是否相通
如何转置数字?
我们知道数值是一个常量,不能直接对其进行位置的转换,但是列表可以
所以可以进行如下转化
❄如何将数字转化成字符串?
str()可以将数字或者将其他参数转化成字符串
例:str(123)
输出:'123'
❄如何将字符串转化成列表?
因为字符串可以迭代,所以可以遍历字符串并将其加入列表。
❄如何转置列表?
使用切片方法[::-1]
例:list = [1,2,3]
print( list[::-1])
输出:[3,2,1]
值得注意的是:python有专门的方法reverse()将列表转置
但是使用这个方法没有返回值
例:list = [1,2,3]
print( list.reverse())
输出:None(无输出)
代码实现
常规解法:
def isPalindrome(x): number = [] for i in str(x): # 带有负号为负数,不是回文数 if i == '-': return False else: number.append(int(i)) # 遍历的i为字符串,用int()将字符串转化为数值 lst = number[::-1] # lst为转置列表 return lst == number
优化一下(发现字符串也可以用[::-1]转置
def isPalindrome(x): return x>-1 and str(x)[::-1]==str(x)
双指针解法:
在列表首尾放入两个指针,不断移动首尾指针直到重合,并判断指针所在值是否相同
def isPalindrome(x): # 先将数值转化为列表 number = [] r = 1 for i in str(x): if i != '-': number.append(int(i)) else: return False j = 0 # 放入指针 k = len(number) - 1 for t in range(len(number)//2): # 指针移动的次数为列表长度的一半 if number[j] == number[k]: j += 1 k -= 1 r *= 1 else: r *= 0 return r == 1
优化一下
def isPalindrome(x): lst = list(str(x)) # 不用int()转换,用list()生成列表 j, k = 0, len(lst)-1 while j <= k: if lst[j] != lst[k]: return False j += 1 k -= 1 return True
完成。
❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄end❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄