从零开始的Python ACM Ch.2:时间复杂度、栈、面向对象及链表
列表与字典的时间复杂度
列表的ls.append()复杂度是O(n),字典的插入dt['key'] = value的复杂度是O(1)。Python自带的字典排序ls.sort()复杂度是O(nlogn)(这个排序算法是用C语言写的,基本上自己在Python里面写的排序算法都没有它快
栈(Stack)
基本操作:
- 压栈
stack.append(element) - 出栈
del stack[-1] - 判断是否为空
len(stack) == 0
面向对象的Python编程
以栈对象为例
1 | class Stack: |
更深一步,在对象里面定义对象的方法
1 | class Stack: |
例题
创建一个类型Rect(矩形),能执行以下代码
1 | r1 = Rect(10, 20) |
我的题解:
1 | class Rect: |
例题:使用列表模拟栈
1 | class Stack: |
对栈进行操作:
1 | import random |
例题:匹配括号
已知一串由小括号( )组成的字符串,试判断该字符串中的括号组合是否合法
我的题解(时间复杂度O(n^2),因为replace要先查找再替换,进行了两次遍历:
1 | s = ()()()(((())))))() |
优化版(利用栈的特性):
1 | class Stack: |
例题:匹配括号(升级版)
在上一题的基础上,括号不只有小括号了,还有中括号[]和花括号{},同样判断括号对是否合法
1 | class Stack: |
all()/any()的用法
官方说明
1 | all() |
应用举例
1 | dt = {1: 0, 2: 0, 3: 1} |
因为字典里面不全是1,在Python里面,1代表True,不全为1所以为False,但是对于any函数,里面一旦出现了True就返回True,所以这里是True
链表
链表里面的基本单位是结点(node),单链表只存储值和下一节点的位置,双链表保存到一个上一节点的位置
1 | class Node: # 单链表 |
用双链表模拟栈
1 | class Node: # 双链表 |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment












