温习数据结构和算法
工作以来,高强度使用离散数据结构,以及操作这些结构算法的机会越发少。晚自习的时候,发现一个有趣的问题-滑动窗口最大值。正好这个问题,和最近在用的时序数据里面的一些数据清理场景很匹配,我突然又重新意识到离散数据节后和算法的一些价值。
花了点时间,看了看链路、堆、字典等。这些结构上,派生出不少经典有趣的问题。
1. 链路反转 - 4行代码解决:
def reverseList(self, head): #方法体定义,不计算在内
prev, cur = None, head
while cur:
prev,cur,cur.next = cur, cur.next, prev
return prev
要记住这段代码,其实需要脑子里面想象,两个夹子和一根链条。每次循环要做的事情,就是先把链条反转,然后将两个夹子都往下移一个位子 - 为下一段联调反转做准备。
2. 链路节点两两互换 - 7行代码解决
def swapPairs(self, head):
prev, prev.next = self, head
while prev.next and prev.next.next:
a = prev.next
b = a.next
prev.next, b.next, a.next = b, a, b.next
prev = a
return self.next
因为是两两对调方向,所以需要三个夹子,处理两段链条。
需要的操作是:加个头,然后用a,b夹住第一段链条。把这里面的两段链条的指向,做适当的调换。然后三个夹子,都往下移一位。
目标是:把这两段动画,在脑子里能存久一点。我争取每天抽2分钟,默写一遍。这还记不住,有点说不过去了吧。因为后边还有更多动画