题目
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
示例1:输入:x = 121 输出:true
示例2:输入:x = -121 输出:false 解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例3:输入:x = 10 输出:false 解释:从右向左读, 为 01 。因此它不是一个回文数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number
Code
第一种方法代码如下:class Solution:
def isPalindrome(self, x: int) -> bool:
if x < 0 or (x > 0 and x % 10 == 0): #负数或大于0且个位数是0的数肯定不是回文数
return False
num = list(str(x))
num.reverse()
y = ''.join(num)
if x == int(y):
return True
else:
return False
首先想到的肯定是上面这种:将数字转换成字符串,再转换成列表,反转列表。但是鉴于有些大佬说这种方法体现不出算法,所以有了下面这种反转一半数字(LeetCode官方给出的方法)。
第二种方法代码如下:
# 反转一半
# 比如12321,反转后一半为123,将12与123//10进行比较,判断是否相等,相等返回True,不等返回False
# 再如123321,反转后一半为123,剩余的123与反转后一半的123相等,所以返回True
class Solution:
def isPalindrome(self, x: int) -> bool:
if x < 0 or (x > 0 and x % 10 == 0): #负数或大于0且个位数是0的数肯定不是回文数
return False
reverted_number = 0
while x > reverted_number:#循环截止条件x<=reverted_number
reverted_number = reverted_number*10 + x % 10
x = x//10
return (x == reverted_number) or (x == reverted_number//10)#x长度为偶数or奇数
测试:
if __name__ == '__main__':
x = 12321
solution = Solution()
print(solution.isPalindrome(x))
总结
题目难度:简单。提交结果显示两种方法差别不大,但是明显第二种比第一种难想。