RounieJane

leetcode5之回文数

题目描述:

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

示例 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,则说明为回文数。

 

posted on 2020-09-02 11:06  RounieJane  阅读(180)  评论(0编辑  收藏  举报

导航