第 2 集
代码执行流程
代码行、i/j 指针移动、lps 回退和 return i-j。
不用加载视频文件,直接逐步查看代码、内存、栈帧和 CPU 阶段。
不加载视频文件,直接用结构化 trace 渲染代码行、内存方格、CPU 阶段和栈帧状态。
func strStr(haystack, needle string) int {// 入口函数 n := len(haystack)// 文本长度 m := len(needle)// 模式长度 if m == 0 { return 0 }// 空模式 if n < m { return -1 }// 长度不够 lps := buildLPS(needle)// 先做记忆表 i, j := 0, 0// 两个指针 for i < n {// i 只向右 if haystack[i] == needle[j] {// 当前相等 i++ j++// 一起前进 } else if j > 0 {// 已有匹配 j = lps[j-1]// i 不动 } else { i++// 没有记忆 } if j == m { return i-j }// 返回起点 } return -1// 没有找到}抽象计算机先在栈帧里放入 i、j、n、m。
HTML 播放器验证期间,保留已渲染 MP4 版本作为回退。
代码行、i/j 指针移动、lps 回退和 return i-j。
PC、栈帧、内存读取、分支判断和变量写回。
为什么空 needle 返回 0,为什么 needle 更长时直接返回 -1。
看 i、length、lps 如何在 needle 自己内部变化。
理解为什么 j 根据 lps 回退,而 haystack 的 i 保持不动。
把生成好的视频作为版本化静态资源放在 public/learning 下。
每个概念一页:视频、要点、文字稿、练习入口放在同一专题页。
样片阶段先 noindex,等形式稳定后再从 Resources 或 Learning Plans 挂入口。