LOOP 05 / INTERVIEW LOOP / 4H
Two-sum:让索引和重复值都正确
你开始正式的数据结构训练。题目很常见,但必须说明答案选择规则、同一元素能否使用两次,以及哈希表里保存的是哪些已经见过的项。
完成单元 41 · 开始唯一主项目的顺序正确性及其先备后安排本次训练。不绑定日历周。
先写自己的答案,再展开参考。这里按技能编写问题,不声称公司真题;自评与阅读都不会自动通过 G0。
先备与学习位置
TIME WITH OUTPUTS
240 分钟怎样用
闭卷恢复先备 · 15min
闭卷说明数组下标、哈希 key/value、optional 无解和 mutex 的作用;本题算法本身不需要引入共享线程。
留下:先不查章节,写三条判断和一个不确定点;再只补读相关章节的解释段。
澄清题目与手算 · 25min
读主问题,逐条写输入、输出、范围与失败行为。手算前两个公开用例,给自己的方案找一个反例。
留下:一份接口合同、逐步状态表和最小反例;不要先打开参考推演。
独立实现或设计 · 55min
给 vector<int> a 和 target,找两个不同索引 i<j 使 a[i]+a[j]=target。若有多个,返回 j 最小的一对;同一 j 下返回 i 最小的一对。返回 optional<pair<size_t,size_t>>。先写两层循环的可信版本,再写从左到右的哈希版本并对照。
留下:保存个人代码或设计稿。编码题保留编译命令;设计题为每个事件编号,不能只画没有状态的箭头。
边界与反证 · 25min
用题目的全部公开用例核对真实输出;另外创造一个与公开输入不同的边界。发现失败时缩小输入,再解释修复。
留下:实际结果、原始失败和修复原因各一份;设计题记录一个被拒绝的执行顺序。
按表现进入追问树 · 35min
从 n1 开始。每题先录下自己的回答,再展开标准;按满足或未满足条件跳转。树最多走一轮,卡住时把剩余时间用于分支中的纠错,不循环加时。
留下:记录经过的节点、原话、缺失条件和修订;只会复述标准的节点仍标记待重做。
英文口述与打断 · 30min
用本页英文提纲录制两轮 90 秒回答;第二轮在 30 秒处自问追问,先回答追问再回到主线。每轮回听并改写两个含糊句。
留下:两轮录音或逐字稿;圈出输入、因果、边界和限制各一句。参考英文在录完第一轮后再读。
复盘与安排重做 · 25min
对照强弱答案,选择一个真正出错的环节:合同、状态、实现、验证或表达。填本页记录模板,并约定下一天的 30 分钟。
留下:一个有失败输入的错误记录和一个可观察修复标准;不要把全部问题归因为粗心。
次日无答案重做 · 30min
次日保留相同答案选择规则,输入 [0,0,0] target=0、[4,-1,4,2] target=3、[2,2,2] target=5。独立重写并与双循环版本核对。
留下:这是本周 240 分钟中的最后 30 分钟,不另加预算。先关闭解答,用 20 分钟独立做,再用 10 分钟核验并记录是否仍需复习。
包括次日重做,总计 240min。局部错因复盘属于本次练习,额外的计划复盘按实际需要另记。
SOLVE BEFORE READING THE ANSWER
先独立处理这个问题
给 vector<int> a 和 target,找两个不同索引 i<j 使 a[i]+a[j]=target。若有多个,返回 j 最小的一对;同一 j 下返回 i 最小的一对。返回 optional<pair<size_t,size_t>>。先写两层循环的可信版本,再写从左到右的哈希版本并对照。
输入与输出合同
- a 长度最多 100;元素与 target 均在 [-100,100],本题算术不会溢出。
- 扫描到 j 时先查 target-a[j],再插入当前值;每个值只保存最早索引。
- 无解返回 nullopt;不能用同一索引两次,不改变输入。
手算之后,对照公开用例
| 输入或情形 | 预期 | 为什么 |
|---|---|---|
| [3,3], target=6 | (0,1) | 两个相同值是两个不同元素。 |
| [3], target=6 | 无解 | 不能重复使用索引 0。 |
| [2,7,2,7], target=9 | (0,1) | 按最小 j 优先。 |
| [1,1,4], target=5 | (0,2) | 同一 j 保留最早 i。 |
| [-2,5,1], target=3 | (0,1) | 负值不破坏补数关系。 |
| [], target=0 | 无解 | 空输入。 |
先保留自己的解法、状态轨迹与验证记录,再打开参考。允许用自然语言或伪代码补充解释;不能用参考输出代替真实运行。
保存独立尝试后,阅读解法与状态轨迹
解法依据
可信版本外层按 j 从 0 开始,内层按 i 从 0 到 j-1,找到第一对即返回,因此符合排序规则。优化版让表只包含 j 之前的值及最早索引;查到补数即得到合法旧索引。插入时不覆盖已存在索引。平均每项一次查询/插入,平均 O(n) 时间、O(n) 额外空间;哈希最坏情况不能保证线性。
逐步推演
[1,1,4],target=5:j=0 查 4 未中,存 1→0;j=1 查 4 未中,保持 1→0;j=2 查 1 命中 0,返回 (0,2)。若覆盖成 1→1,返回值满足和却违反最早索引合同。
FOLLOW THE ANSWER, NOT A SCRIPT
从回答进入下一层追问
从 n1 开始。先录下回答,再展开判定;达到条件就走深入分支,未达到就按反馈缩小问题。一次最多走一轮,不靠反复查看同一答案累积“通过”。
NODE n1
先插入再查询,哪一个公开输入能反驳?
NODE r1
把第一个追问缩到最小输入,重新逐步说明。
我已作答:查看判定与下一分支
需要解释清楚:[3],target=6 会错误地找到当前索引自身;必须先查已有元素。
NODE n2
只返回任意一对时,排序加双指针可以吗?本题还要注意什么?
NODE n3
这是多线程安全的函数吗?
我已作答:查看判定与下一分支
需要解释清楚:每次调用只读输入且使用局部表时,独立调用不共享可变状态;若其他线程同时修改输入或共用表,结论改变。
答案强在哪里,弱在哪里
保存自己的回答后,打开对照
弱答案
“哈希 O(1),先存进去再查;重复值无所谓。”
强答案
“表中只能有当前索引之前的项,所以我先查询再插入,避免 [3] 配对自身。每个值保留最早索引,以满足同一 j 的选取规则。平均时间线性,但哈希的最坏情况需要单独说明。”
强答案把数据结构的不变量和输出规则连起来,能解释为什么交换两行会出错,也没有把平均复杂度说成无条件保证。
在自己的原回答里划出一个缺失的条件或错误推理,再重说一遍。完整句子背熟,不代表能处理新约束。
ANSWER, THEN HANDLE AN INTERRUPTION
英文口述与打断
Explain the invariant before naming the data structure.
- State which indices are already stored.
- Use [3] and [3,3] to distinguish reuse from duplicates.
- Qualify average complexity.
“What changes if duplicate keys overwrite the old index?”
录完第一轮后,读英文示范
Before processing index j, the map contains only earlier elements and their earliest indices. I look up the complement before inserting the current value, so I never reuse the same element. Two equal values at different indices are allowed. The expected running time is linear, with extra space proportional to the number of distinct values.- 前 15 秒说明输入、输出和一个关键约定。
- 至少用一个本题的数值解释因果,不只罗列英文术语。
- 明确一个边界或尚未验证的限制;不能把教学推演说成项目经验。
次日关掉解答,换一个问题
次日保留相同答案选择规则,输入 [0,0,0] target=0、[4,-1,4,2] target=3、[2,2,2] target=5。独立重写并与双循环版本核对。
独立重做后核对
依次为 (0,1)、(0,1)、无解。再自选 20 个长度≤6 的小输入做两版差分;两版一致仍需解释规则,不能互相复制同一个错误。
- 关闭主问题答案并使用新输入独立完成。
- 给出结果与原因;失败时记录最小反例,不能只把完成标记改成通过。
重做的 30min 已计入本套4h;需要更多补课时记录实际用时,按缺口顺延。
记录实际回答与证据
# W05 算法 / 英文训练记录(仅个人练习,不是能力认证)
日期:
本次先备与尚不确定点:
主问题接口合同:
我最初的方案与状态表:
运行命令或设计事件编号:
失败输入 / 预期 / 实际:
修复与理由:
追问路径(节点 → 自己原话 → 缺口):
英文第一轮两处含糊句:
英文第二轮修订:
次日重做日期(30 分钟已含本周预算):
重做输入 / 实际结果 / 解释:
仍需补练:
本次练习的检查依据
两个实现对公开与自加输入一致;索引不同、选择规则正确;能给出先插入的反例和平均/最坏复杂度区别。
模板在你的个人笔记中填写。网页只提供空模板;不会把这次训练写成项目经验或学习验收结果。