> 文档中心 > Python每日一练-----难题唯唯诺诺,易题重拳出击?(回文数)

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❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄