Leetcode | Python刷Leetcode注意点
想尝试拿python刷刷leetcode,随手记一点注意事项
一些不一样的写法⁍
三元表达式⁍
r = a if condition else b
True or False⁍
大写
没有自增和自减⁍
i += 1
/i -= 1
最大值/最小值⁍
1 |
|
进制转换⁍
-
转10进制
1
int(str, base)
-
转2进制
1
bin(int) -> str # '0b10'
-
转8进制
1
oct(int) -> str # '0o77'
-
转16进制
1
hex(int) -> str # '0xff'
运算⁍
1 |
|
指定排序⁍
1 |
|
二维数组赋值⁍
1 |
|
数据结构⁍
str[^1]⁍
不可变有序序列
常用函数
1 |
|
常用的功能
- 拼接(加),
s1 + s2
- 切片,
s[start: end: space]
- 重复(乘),
s * 10
tuple⁍
元组, 也叫静态列表. 内置的数据结构, 可以直接使用, 无须导入.
- 元组常用于多变量赋值和多值返回, 只是一般在使用的时候没有加上小括号, 以显得python的牛逼之处.
- 需要注意的是, 当tuple里只有一个元素时, 需要在该元素之后加上
,
, 如t=(1,)
, 否则它就不是tuple, 而是该元素的类型. - 同样支持拼接, 切片, 重复等操作
- 提供的函数仅有
index
和count
list⁍
经常使用的数据结构, 可以实现简单的队列, 栈等.
常用功能: 拼接, 重复, 切片
强大的切片功能, 可用于取值, 替换, 删除等
lst[i:j] = t
, 其中 t 是可迭代序列del lst[i:j]
, 相当于lst[i:j] = []
.
常用函数
1 |
|
字典/哈希表⁍
dict⁍
- 初始化:
map={}
- 查找key:
value=map[key]
- 加入key或更改key的值:
map[key]=value
- 判断key是否存在:
if key in/not in map
- 遍历key:
for key in map
常用方法
1 |
|
OrderedDict⁍
有序字典, 使得插入的顺序有序. (官方解释: Dictionary that remembers insertion order)
同样也继承于 dict
, 所以可以使用 dict
所拥有的方法.
添加的方法:
1 |
|
集合⁍
set, 主要用于去重的操作.
需要注意的是
- 它的定义. 只能使用实例的方式定义, 如
s= set();s={1,2,4,8}
, 而不能这样定义s={}
. 因为这样定义的是一个字典, 不能使用集合的方法. - 无序特性. 有时候你会在 N 次输出同一个集合的时候, 发现它是有序的, 但是请你也一定不要相信集合是有序的.
常用函数
1 |
|
队列⁍
1 |
|
堆队列⁍
可实现优先级队列的数据结构. 可以解决 top n
问题, 如从1亿个数里面找出最大或最小的100个数
1 |
|
常用函数
1 |
|
二叉树⁍
初始化⁍
1 |
|
遍历⁍
深度遍历⁍
递归⁍
1 |
|
迭代⁍
先出最左的就要遍历到最左!中间的就直接处理
-
前序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
result = []
stack = []
if root == None:
return []
stack.append(root)
while st:
node = stack.pop()
result.append(node.val) # 中
if node.right:
result.append(node.right.val) # 右
if node.left:
result.append(node.left.val) # 左
return result -
中序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
result = []
stack = []
# 注意循环条件
while root or stack:
if root:
# 先将中节点压栈,等会处理
stack.append(root)
root = root.left
else: # 左节点全部遍历完
# 中节点出栈,加入结果集
root = stack.pop()
result.append(root.val)
root = root.right
return result -
后序
一种思路是按前序处理,最后数组翻转
return result[::-1]
这里尝试用栈来写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
res = []
stack = []
# 前置节点
prev = []
while root or stack:
if root:
stack.append(root)
root = root.left
else: # 遍历完左节点
# 取出节点
root = stack.pop()
# 下一个就是看右节点
if not root.right or root.right == prev:
# 如果右节点已经遍历过了
# 将结果加进去(中)
res.append(root.val)
# 中节点变右节点
prev = root
root = None
else:
# 否则系欸但入栈
stack.append(root)
root = root.right
return res -
统一写法:在后面加上
None
节点,调整顺序即可
1 |
|
层序⁍
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 若叶!