我的误区整理
1. 不能一再强调设计模式,设计模式不是目的是手段,是为了吧经常变的地方,把要变动的逻辑减少,一部分固定起来这就是设计模式,(这跟函数一样,不能莫名其妙就新建一个函数,即使只调用一次) 所以优先考虑朴…
最后更新 2026年9月12日
- 不能一再强调设计模式,设计模式不是目的是手段,是为了吧经常变的地方,把要变动的逻辑减少,一部分固定起来这就是设计模式,(这跟函数一样,不能莫名其妙就新建一个函数,即使只调用一次) 所以优先考虑朴素实现。
- 为了避免考虑+1问题,所有问题全部左闭右开
[l,r),长度就是r-l,空区间就是l==r,拼接[a,b)+[b,c)=[a,c)要给每一个变量精确的语义。不要在脑中模拟
❌ "i 用来遍历数组" —— 这是动作描述,验证不了任何东西
❌ "i 大概在已处理和未处理的分界附近" —— 模糊,±1 说不清
✅ "每次循环开始时,[0, i) 的元素已写入结果,i 指向第一个未处理元素"- 写出来的东西要为自己负责,不能说边界条件就不考虑。 日后在真实场景中如果我遇到了边界条件,比如之前的携程汽车票订票,因为网络问题,同步错误,耽误行程。所以我们要为自己写出来的代码负责;复习记录清除,可能边界小众情况都有人会遇到,所以一定要照顾到所有人
- 向上取整 5/2=3 6/4=2 8/2=4 怎么写呢
def div(num1,num2):
return (num1+num2-1) // num2- python的
sorted(iterable,key,reverse)reverse=False为升序,后面两个为关键字参数 - 几个数据结构区分
| 数据结构 | 核心机制 | 元素进出规则 | 典型时间复杂度 | 适用场景 |
|---|---|---|---|---|
| 栈 (Stack) | 后进先出 (LIFO) | 仅单端(栈顶)进出 | Push/Pop: O(1),查最值: O(n) | 括号匹配、逆波兰表达式、递归调用模拟 |
| 单调栈 (Monotonic Stack) | 栈内元素保持单调递增/递减 | 栈顶进出,压栈前弹掉破坏单调性的元素 | 均摊 Push/Pop: O(1) | 寻找下一个更大/更小元素、柱状图最大矩形 |
| 双端队列 (Deque) | 两端均可快速操作 | 头尾两端均可进出 | 两端 Push/Pop: O(1),查最值: O(n) | 需要两端读写的滑动窗口、BFS 双向搜索 |
| 单调队列 (Monotonic Deque) | 队内元素单调,头删尾插 | 队尾维护单调性,队头淘汰过期元素 | 均摊操作: O(1),查最值: O(1) | 固定/变长滑动窗口最值、区间 DP 优化 |
| 优先队列 / 堆 (Priority Queue / Heap) | 完全二叉树,堆顶始终是最值 | 任意顺序插入,仅堆顶弹出最值 | Push/Pop: O(log n),查最值: O(1) | Top-K 问题、Dijkstra 最短路、合并 K 个有序链表 |
-
python break只会跳出内层循环
for/while ... else...当且仅当while或者for循环从头到尾跑完,没有被break的时候才会执行else代码。 -
ssh -L 端口号:本机回环地址:端口号 用户名@公网ip
ssh -L 18802:127.0.0.1:18802 ubuntu@110.xx.xx -
nonlocal在内层函数使用修改外层函数;global找的是模块级全局变量 -
git分支注意主分支
master,main设置主分支不同的时候会产生冲突
git branch -m master main # 改名
git branch --set-upstream-to=origin/main main # 重新设置远端上游
git pull # 拉取合并 fetch+merge- dp中有的时候需要多开数组,因为0可能也有意义:比如空串。
反向链接(0)
还没有笔记链接到这里。在 Obsidian 里用 [[笔记名]] 引用它,这里就会出现,关系图谱上也会多出一条连线。