您的位置:首页 > 其它

LeetCode每日一题--回文数

Mingw_ 2020-03-15 18:22 29 查看 https://blog.csdn.net/mingw_/a

  【前言】坚持日更LeetCode刷题系列

   不积跬步,无以至千里;不积小流,无以成江海。愿与诸君共勉!


  【题目】9.回文数

   判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

  示例:

示例 1:
输入: 121
输出: true

示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。

  思路一:很显然我们可以将此整数转化为字符串后,定义两个列表,一个存入原始数据,另一个进行逆转操作,再用列表中的eq函数进行判断即可。代码如下:

import operator
class Solution(object):
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
x = str(x)  #将整数转化为str类型
list1 = []
list2 = []
list1 = list(reversed(x))  #用一个列表存逆转数据
list2 = list(x)    #用另一个列表存原始数据
result = operator.eq(list1,list2) #调用eq函数判断两个列表是否相同
return result

  运行结果:

  

Notice:
可能有朋友会自然的想到,在比较两个列表是否相同时,直接用
‘==’ 比较运算符
,但此种比较方式,只能判断列表内数值是否相等,而不能判断其位置情况,例如:list[1,2,3]和list[2,1,3]在用‘==’比较运算符时会返回true。

  
补充:
看到LeeCode上其他前辈的写法中,我们可以直接用str类型,而不需要将其放入list进行操作,一开始我想通过list来简单的实现逆转操作,可能受上一题的影响,自然而然的想到这种方法,但是我们同样可以 通过字符串的切片操作将其逆转。

  关于其中一些知识的链接:

  Python比较两个List相等的方法


  思路二:利用模十的方法,将得到的x每个数码用list存起来,再将其还原为整数,实现首尾数码的调换。对于其中数码最后一位为 0 的整数,以及符号为负的整数进行剔除,但注意其中整数为0的特例,不能进行剔除。代码如下:

class Solution(object):
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
if (x!=0 and x%10==0) or x<0:  #剔除尾码为0以及负数的情况
return False
else:
original_num = x	#因为之后的x值会改变,因此要存入原始x值
reversed_num = 0    #逆转之后的值
list1 = []
while x>0:
list1.append(x%10)
x =  x//10
for i in range(len(list1)):
reversed_num = reversed_num*10+list1[i]
if(reversed_num == original_num):
return True
else:
return False

  运行结果:

  

补充:
这种算术解法未进行优化,导致运行用时过长,有兴趣的朋友可以查看下面的算法讲解视频,了解更进一步的优化过程。


  关于其中一些知识的链接:

  回文数进一步优化算法(C++版)


  分享就到这里了,欢迎大家一起交流讨论。

  注明:

  题目来源:力扣(LeetCode)
  链接:https://leetcode-cn.com/problems/palindrome-number

  • 点赞 2
  • 收藏
  • 分享
  • 文章举报
Mingw_ 发布了36 篇原创文章 · 获赞 64 · 访问量 2788 私信 关注
标签: