从零开始的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