Python3解决回文数问题
一、回文数的概念
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如:121 ,abcdedcba,123321等都是回文数
第一种解法:
思路:
(1)首先我们要考虑负数(如-121),倒序则是121- 显然与正序不等
所以负数很明显不是回文数,要单独进行考虑
(2)像XX0这样的数也一定不是回文数,因为最高位不能为0(除了0本身)
(3)其余的我们就可以运用字符串里面的截取字符串来做。string【start:end:step】
代码
class Solution:
def isPalindrome(self, x: int) -> bool:
if x<0 or (x!=0 and x%10==0):
return False
if str(x)[::]==str(x)[::-1]:
return True
第一个if语句是对应思(1)(2)情况而言的,第二个if是一个一个比较正序的第X个数与倒叙第X个数进行,如果都相等就会返回True
第二种解法:
思路:
运用栈的pop来做,以及深度copy,collections模块中的deque
废话不多说上代码来分析:
from collections import deque
import copy as cp
a = deque(list('abcdedcba'))
b = cp.deepcopy(a)
n = len(a)
cnt = 0
while True:
if len(a) == 0: break
if len(b) == 0: break
if a[0] != b[-1]: break
# advance to next char by popping both stacks from opposite ends
a.popleft()
b.pop()
cnt+=1
print('palindrome =', n > 0 and cnt == n)
先测量一下输入的数字或字符串的长度,然后判断a或者b是否为0,如果有为0就停止出栈操作,或者是a的正序第x个数与b的倒序第x个数是否相等,如果不能也停止,如果等于,则a继续从后面pop,b继续从前面pop,直到满足if语句中的任意一条就停止,如果cnt等于n就是回文
图形理解:
deque:使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x')
q.appendleft('y')
q
deque(['y', 'a', 'b', 'c', 'x'])
deepcopy:用copy模块的deepcopy()方法进行深拷贝,相当于将对象的数据结构全部都复制一份,两者将是完全独立的个体,互不影响
import copy
a = [[1,2,3],4]
b = copy.deepcopy(a)
a[0][1] = 5
print(a) # [[1, 5, 3], 4]
print(b) # [[1, 2, 3], 4]