题目描述:
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number
代码实现:
1 def ishuiwenshu(x): 2 ''' 3 判断一个数是否为回文数 4 :param x: 5 :return: 6 ''' 7 s = str(x) 8 left, right = 0, len(s) - 1 9 while left < right: 10 if s[left] == s[right]: 11 left += 1 12 right -= 1 13 else: 14 return False 15 return True 16 17 18 print("---------测试ishuiwenshu()-------") 19 print(ishuiwenshu(0)) 20 21 22 def ishuiwenshu1(x): 23 if x > 0 and x % 10 == 0: 24 return False 25 if x < 0: 26 return False 27 reverseNumber = 0 28 while x > reverseNumber: 29 reverseNumber = reverseNumber * 10 + x % 10 30 x //= 10 31 32 return True if x == reverseNumber or x == reverseNumber // 10 else False 33 34 35 print("-------测试ishuiwenshu1()-------") 36 print(ishuiwenshu1(12321))
总结:上面提供两种方法来实现回文串的判断,方法一采用将数字转换为字符串的形式,较为简单,但会开辟额外的空间,空间复杂度高;方法2直接在数字上进行,空间复杂度小,每次只需要常数空间来存储,空间复杂度为O(1),因每次都需要除以10,时间复杂度为O(log n)。
方法2思路:
对特殊情况,如果为负数,不可能是回文串,如果数是正数且最后一位为0,不可能是回文串,因为数的最高位不可能是0;数只有一位时,肯定为回文串;
当判断是否为回文串时,可以将数进行反转,如果反转数和原数相同,则说明为回文数,但此种情况存在潜在的BUG,那就是如果反转后数过大超出int.MAX,存在溢出内存的风险,因此考虑反转数的一半,若反转得到的一半数等于剩余数,则判断为回文串。现在存在一个问题。如何确定反转位数刚好为一半,当得到反转数大于等于剩余数时,说明此时完成了一半反转数。
测试用例:当输入数位数为偶数位时,如1221,得到的反转数和剩余数相等,但如果输入数位数为奇数时,比如12321,最后得到的reverseNumber=321,x=12,中间数不用判断,因此若reverseNumber//10==x,则说明为回文数。