Python3解决回文数问题

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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

William_Tao(攻城狮)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值