每周完成一个 ARTS: 至少做一个 leetcode 的算法题、阅读并点评至少一篇英文技术文章、学习至少一个技术技巧、分享一篇有观点和思考的技术文章。(也就是 Algorithm、Review、Tips、Share 简称 ARTS)
Algorithm

第一版:单个 minIndex
最开始的想法是用一个 minIndex 记录当前最小值在 list 中的下标。push 的时候比较并更新 minIndex,getMin 直接通过 minIndex 取值。
问题:pop 的时候如果弹出的恰好是最小值,就需要重新遍历/排序找新的最小值,做不到 O(1)。
而且只记录「倒数第二小」也不够,连续 pop 多次,每次弹出的都可能是当前最小值,需要第三小、第四小……本质上需要记住每一层的最小值。
第二版:辅助栈
用一个辅助栈 minStack,和主栈同步 push/pop。minStack 每一层存的是「从栈底到当前这一层为止的最小值」。这种方式是我问 AI 才知道的,随然多了一个 ArrayList 但是 push 和 getMin 都是 O(1)
| 操作 | 主栈 stack | 辅助栈 minStack |
|---|---|---|
| push(5) | [5] | [5] |
| push(3) | [5, 3] | [5, 3] |
| push(7) | [5, 3, 7] | [5, 3, 3] |
| push(1) | [5, 3, 7, 1] | [5, 3, 3, 1] |
| pop() | [5, 3, 7] | [5, 3, 3] |
| getMin() | — | 栈顶 = 3 ✓ |
关键:push 时辅助栈压入 min(新值, minStack 栈顶);pop 时两个栈一起弹;getMin 直接读辅助栈栈顶。
最终代码:
import java.util.ArrayList;
class MinStack {
private final ArrayList<Integer> stack;
private final ArrayList<Integer> minStack;
public MinStack() {
stack = new ArrayList<>();
minStack = new ArrayList<>();
}
public void push(int value) {
stack.add(value);
if (minStack.isEmpty() || value <= minStack.get(minStack.size() - 1)) {
minStack.add(value);
} else {
minStack.add(minStack.get(minStack.size() - 1));
}
}
public void pop() {
stack.remove(stack.size() - 1);
minStack.remove(minStack.size() - 1);
}
public int top() {
return stack.get(stack.size() - 1);
}
public int getMin() {
return minStack.get(minStack.size() - 1);
}
}
复杂度:
- 时间:push / pop / top / getMin 全部 O(1)
- 空间:O(n),辅助栈和主栈等长
需要注意的点:
- push 时先 add 再更新 minIndex(顺序反了会导致 index 指错)
- pop 时注意 remove 之后 size 已经变了,不要用变化后的 size 去操作另一个栈
- 单个 minIndex 方案在 pop 最小值时需要重新遍历,无法做到 O(1)
Review
文章:https://www.practicalnetworking.net/stand-alone/the-truth-about-the-osi-model/
文章指出 OSI 模型从未在实际网络中被广泛使用,当年因委员会争论过多而迟迟无法落地,反而是更简洁的 TCP/IP 模型先行投产并成为事实标准。但 OSI 作为教学工具仍有价值,关键在于教法要对:应把每一层看作「抽象层」,关注其承担的职责(如 L3 负责端到端、L4 负责服务到服务),而不是死记硬背层名和定义。各职责之间并非严格按层序执行,实际协议中顺序可能交叉。作者建议未来全面转向 5 层 TCP/IP 模型,但现阶段教育和认证体系仍绑定 OSI,短期内难以脱离。
Tips
1)修改 commit 信息
1、查看提交历史,找到需要修改的 commit 的前一个 commit id:
git log
2、执行交互式 rebase 进入编辑:
git rebase -i <commit-id>
按 i 进入编辑模式,将目标提交前的 pick 改为 edit,按 Esc 输入 :wq 保存退出(同 Vim 逻辑)。若仅修改提交信息,直接执行 git commit --amend。
3、修改文件内容(如删除不必要的信息等),修改完成后重新提交(也可直接在 IDE 中操作):
git add .
git commit --amend
4、继续执行后续 rebase 流程:
git rebase --continue
5、强制推送到远程(使用比 --force 更安全的 --force-with-lease):
git push --force-with-lease <remote> <branch>
6、若推送遇到登录认证失败,使用 gh 唤起浏览器完成授权:
gh auth refresh -h github.com
7、查看 GitHub 登录状态,确认登录成功:
gh auth status
2)不让 Cursor 进行 commit 的时候携带上 "Co-authored-by" 信息,之需要修改配置(取消这个 Commit Attribution):

Share
文章:https://www.gatesnotes.com/a-turbulent-ai-era-and-critical-choices-to-make
Bill Gates 在 2026 年 8 月发表了这篇长文,核心论点是:AI 有可能成为「有史以来最伟大的均衡器」,但前提是我们现在就做出正确的选择。
Gates 对 AI 的态度始终是乐观的。他看好 AI 在医疗、教育、农业、清洁能源和科学研究等领域的巨大潜力,认为 AI 能让优质资源触达更多人。但这次他的语气比以前更务实——他第一次表示希望技术的发展速度能稍微慢一点,给社会留出准备时间。
文章最有价值的部分是他提出的几个建设性方案:
- 「人类保留」岗位:在医疗护理等需要人类情感和判断力的领域,应该有意识地保留人类角色,而不是全部交给 AI。
- 治理框架:呼吁建立新的国内和国际组织来管理 AI 风险,没有全球框架的话贫富差距只会加大。
- 经济政策:讨论了对 AI 和机器人征税的可能性,用来缓解大规模自动化带来的社会冲击。
这篇文章不是在贩卖焦虑,而是在说:AI 本身是中性的,关键在于我们怎么选。与其被动等待被颠覆,不如主动设计规则让技术为更多人服务。