智力题(一):信息量、状态与逻辑推理
智力题(一):信息量、状态与逻辑推理
导语:智力题在面试里不考背诵,考的是"把生活语言翻译成数学模型"的能力——拆解条件、找约束、找不变量、验证边界。本篇覆盖最高频的四大类:信息量与编码(称重/药丸)、状态转移(分水/计时)、逻辑推理(真假话/标签/握手)、公共知识(囚犯与灯泡),共 14 题,每题都给出"可迁移的套路"。
一、答题方法论
1. 智力题应该怎么答?高频套路有哪些?
答: 不要急着报答案——先展示方法,再给出结论,这是面试官真正在看的东西。
标准开场句式(可直接背):
「我先澄清题面条件,然后定义状态空间与约束,再看"每一步操作能获得多少信息"或"哪个量是不变的",最后给出步骤并验证最坏情况。」
七大高频套路(背下来就有方向):
| 套路 | 核心思想 | 代表题 |
|---|---|---|
| 信息量 / 编码 | 一次实验有 k 种互斥结果,n 次实验最多区分 kⁿ 种状态 | 9 球、13 石头(天平 3 种结果)、1000 瓶药(老鼠 2 种结果) |
| 状态转移 | 把每一步写成状态,在状态空间里搜索(常是 BFS) | 分水、量酒 |
| 不变量 / 模运算 | 找到每轮都保持的关键量;博弈题先找"必败态" | 100 苹果、52 张牌 |
| 公共知识 / 归纳 | 「我知道」与「我知道你知道」的层层递推 | 病狗、黑帽、囚犯与灯泡 |
| 条件概率 / 贝叶斯 | 不能忽略先验概率(基数效应) | 艾滋病检测、两个孩子 |
| 假设排除 | 从最后一句成立的条件向前枚举、逐条排除 | 真假话、谁偷吃了 |
| 抽象建模 | 把故事还原成公式/图/区间问题 | 火车与鸟、过桥、骑马 |
三个答题纪律(比答案更重要):
① **先澄清条件**:智力题最常见的"坑"就是题面缺少隐含条件
(如"是否只有一条路有宾馆""主持人是否知道答案")→ 主动问,而不是硬答
② **主动说最坏情况**:称重类说"最坏情况下需要 n 次";策略类说"对手最优应对时"
③ **结尾给可迁移结论**:"这题的本质是 XXX 思想,在工程上对应 YYY"
—— 这一句是智力题面试的"加分点"(见《智力题(二)》最后一题)二、信息量与编码类
2. 9 个球有 1 个较重,用天平 2 次找出?13 个石头最多几次?
答:
9 个球(已知重球偏重):
为什么可以(面试官想听的核心):
天平一次有 3 种互斥结果(左重 / 右重 / 平衡),因此 2 次实验最多区分 3² = 9 种状态。 恰好覆盖 9 个球 9 种可能,所以 2 次是理论下界,也是可达上界。
13 个石头:
① 13 分成 4 / 4 / 5
② 第一次:4 ⚖ 4
· 不平衡 → 重球在重的 4 个里 → 4 分成 2/2,第二次 2 ⚖ 2 找重的 2 个,
第三次 1 ⚖ 1 找出 → 共 3 次
· 平衡 → 重球在 5 个里 → 5 分成 2/2/1,
第二次 2 ⚖ 2:不平衡则第三次 1 ⚖ 1;平衡则答案是剩下的 1 个 → 共 3 次
→ 最坏情况 3 次 ✅通用模型(把这道题变成"公式题"):
若一次实验有 k 种互斥结果,做 n 次,最多区分 **kⁿ** 个状态。
天平(已知偏重):
3¹ = 3 → 最多 3 个球
3² = 9 → 最多 9 个球
3³ = 27 → 最多 27 个球
⚠️ 注意"已知偏重"与"不知偏重或偏轻"的区别(见下方追问)追问:「如果不知道异常球是偏重还是偏轻,答案会变吗?」
会变,难度显著上升。 因为每个球有 2 种可能状态(偏重/偏轻),n 个球 = 2n 种状态:
12 个球、1 个异常(不知轻重)、用天平 3 次找出并判断轻重 —— 经典难题
状态数 = 12 × 2 = 24 ≤ 3³ = 27 → 信息量上"可行"
(但 13 个球 × 2 = 26 ≤ 27 也"看起来可行",却因为**边界情况(第一次称重必须均分)**
与"缺少真实球参照"而无法做到 → 这是经典的"信息量是必要条件、不是充分条件"的例子)面试价值:主动提一句「信息量给出的是"下界",能否达到还要看构造」,立刻与"只背答案"的人区分开。
3. 20 瓶药丸一次找出变质瓶?10 瓶药一次找出?
答: 两个题本质完全相同——用"取不同数量"把瓶编号编码进"重量偏差"。
20 瓶(19 瓶每粒 1g,1 瓶每粒 1.1g):
① 给瓶子编号 1 ~ 20
② 从第 i 瓶取 i 粒(1 + 2 + ... + 20 = 210 粒)
③ 全部一起称重
· 若全部正常,总重 = 210 g
· 实际比 210 多 0.1 × k 克 → 第 k 瓶有问题
✅ 一次搞定10 瓶(每瓶 10 粒,1 瓶变质,每粒比好药重 0.1g):
① 编号 1 ~ 10,分别取 1、2、…、10 粒(共 55 粒)
② 称重得 x 克
③ 变质瓶编号 = (x − 55) / 0.1
✅ 一次搞定这类题的通用框架(可迁移的套路):
问题:从 N 个候选中找出 1 个,只允许"一次测量"
解法:**把候选编号编码成"测量结果的一个可区分量"**
· 编号 i 的候选 → 贡献 i × δ 的偏差
· 测量结果 = 基准值 + k × δ → 反解出 k
同类变形:
· 一堆硬币里有一枚假币(重量不同)→ 用"取不同枚数"编码
· 一堆容器里有一瓶浓度不同 → 用"混合取样"编码
· 1000 瓶药、10 只老鼠 → 二进制编码(见下一题)关键洞察:这道题和"1000 瓶药 + 10 只老鼠"是同一个信息编码思想——区别只是"一次实验能区分多少种结果":
称重题:结果是一个连续量(偏差值),能区分很多种 → 一次实验就能搞定 N 个候选;
老鼠题:结果只有死活 2 种(离散),所以需要 log₂N 只(并行做多次"二值实验")。
三、状态转移与计时类
4. 7 克和 2 克砝码各一个,如何三次把 140 克盐分成 50 克和 90 克?
答: 这是一道容易被"想当然"坑到的题,关键在第三步——用一个已经称出来的盐当作砝码。
【第 1 步】平分 140 克
不用砝码,靠天平平衡把盐分成两份 → 每份 70 克
(此时:70 / 70)
【第 2 步】用砝码称出 9 克
把 7g + 2g = 9g 砝码放天平一边,另一边从某一份 70 克里取盐直到平衡
→ 得到 9 克盐;该份剩余 70 − 9 = 61 克
(此时:9 克、61 克、另一份 70 克)
【第 3 步】把"9 克盐 + 2 克砝码"当作 11 克的砝码 ★ 关键一步
天平一边:9 克盐 + 2g 砝码(合计 11 克)
天平另一边:从 61 克里取盐直到平衡 → 称出 11 克
→ 61 − 11 = **50 克** ✅
【汇总核对】
50 克(第 3 步剩下的 61 − 11)
+ 90 克(9 + 11 + 70 = 90)✅这题的思维转折点(面试官想听的):
① 天平不仅能"称量已知砝码",还能"复制已知重量"
—— 把已经称出来的 9 克盐当成新的砝码用
② "三次"意味着每一步都要产出"有用的中间量",不能有浪费
③ 结合关系:50 = 70 − 20 = 70 − (9 + 11);而 11 = 9 + 2
→ 所以只要能"称出 11 克",50 就自然出现了5. 两条不均匀的绳子各烧完 1 小时,如何测 15 分钟?如何测 1 小时 15 分钟?
答:
关键前提:绳子不均匀(不能按长度比例换算时间),但从一头烧完恒为 1 小时。
核心技巧:
★ 同时点燃绳子的【两头】→ 烧完正好是 30 分钟
理由:从两头烧的总速度 = 单头的 2 倍,而"总燃烧量"不变
(不均匀只影响"单头烧时各段耗时的分布",不影响"两头同时烧完 = 一半时间")
★ 若要求"剩余部分还能烧 X 分钟",就用"一头点燃"来控制① 测 15 分钟:
① 同时点燃 R1 的【两头】、R2 的【一头】
② R1 烧完时 = 30 分钟;此刻 R2 恰好还剩 30 分钟的"单头燃烧量"
③ 此时点燃 R2 的【另一头】→ R2 剩余部分两头同时烧 → 15 分钟烧完 ✅
→ 从"点燃 R2 另一头"到"R2 烧完"的这段,正好是 **15 分钟**② 测 1 小时 15 分钟(准备 3 条绳):
① 点燃 R1 两头 + R2 一头
② R1 烧完(30 分钟)→ 点燃 R2 另一头
③ R2 烧完(累计 45 分钟)→ 点燃 R3 的【两头】
④ R3 烧完(30 分钟后)→ 累计 45 + 30 = **75 分钟 = 1 小时 15 分钟** ✅可迁移的结论:
"两头点燃 = 时间减半"是唯一的不变量。所有烧绳题都是围绕它做加减法:需要在某个时刻"启动"一段新计时,就点燃一头;需要把剩余时间对折,就点燃另一头。
6. 5L 和 3L 的杯子,如何量出 4L 水?(状态转移与 BFS 建模)
答:
手工步骤(目标 4 = 5 − 1,而 1 = 3 − 2,2 = 5 − 3):
状态写作 (5L 杯, 3L 杯)
① (0,0) 开始
② (5,0) 5L 杯装满
③ (2,3) 倒入 3L 杯(3L 杯满,5L 杯剩 2)
④ (2,0) 倒空 3L 杯
⑤ (0,2) 把 5L 杯的 2L 倒入 3L 杯
⑥ (5,2) 5L 杯再装满
⑦ (4,3) 倒入 3L 杯(只能倒 1L)→ **5L 杯正好剩 4L** ✅为什么这题能"程序化"(面试的重点):——它就是一道 BFS 题
【抽象成状态机】
状态 State = (a, b) a ∈ [0,5],b ∈ [0,3]
动作 Action = { fillA, fillB, emptyA, emptyB, pourA2B, pourB2A }
目标 Goal = (a == 4) || (b == 4)
【转移规则(每个动作的语义)】
fillA : a → 5
fillB : b → 3
emptyA : a → 0
emptyB : b → 0
pourA2B : t = min(a, 3 − b); a -= t; b += t
pourB2A : t = min(b, 5 − a); b -= t; a += t
【解法】BFS(每一步代价相同,BFS 保证最短步数);用 visited 集合避免回路
【Java 建模】
record State(int a, int b) {}
Queue<State> queue = new ArrayDeque<>();
Map<State, State> parent = new HashMap<>(); // 用于回溯路径可迁移的结论(这才是面试官要的):
「分数/容量类题的通用解法是把它建模成状态机 + BFS」——当状态空间很大、手工试不出来时,程序化搜索能保证找到解并给出最短步数。同类题(7 两与 11 两量 2 两酒)用同一套方法。
7. 5L 与 6L 桶量 4L?7 两与 11 两勺量 2 两?
答:
① 5L 与 6L 桶量 4L:
状态 (5L桶, 6L桶)
① (0,0)
② (5,0) 装满 5L 桶
③ (0,5) 倒入 6L 桶
④ (5,5) 再装满 5L 桶
⑤ (4,6) 倒入 6L 桶(只能倒 1L)→ **5L 桶剩 4L** ✅
→ 只需 4 步② 7 两与 11 两勺量 2 两酒(通用解法:小勺反复往大勺倒):
状态 (7两勺, 11两勺)
① (7,0) 装满 7 两勺
② (0,7) 倒入 11 两勺
③ (7,7) 再装满 7 两勺
④ (3,11) 倒入 11 两勺(只能倒 4)→ 7 两勺剩 3
⑤ (3,0) 倒空 11 两勺
⑥ (0,3) 把 7 两勺的 3 倒入 11 两勺
⑦ (7,3) 装满 7 两勺
⑧ (0,10) 倒入 11 两勺(还能装 8)
⑨ (7,10) 装满 7 两勺
⑩ (6,11) 倒入 11 两勺(只能倒 1)→ 7 两勺剩 6
⑪ (6,0) 倒空 11 两勺
⑫ (0,6) 把 6 倒入 11 两勺
⑬ (7,6) 装满 7 两勺
⑭ (2,11) 倒入 11 两勺(还能装 5)→ **7 两勺剩 2 两** ✅通用规律(面试可以主动总结):
记两个容量为 a(小)、b(大),要量目标 t:
① 若 t 能被 gcd(a, b) 整除 → 有解(这是数论上的充要条件,来自辗转相除)
例:5 与 3 量 4 → gcd=1,可整除 → 有解
7 与 11 量 2 → gcd=1,可解
6 与 4 量 1 → gcd=2,不能整除 1 → **无解**
② 构造解的标准套路:「**反复把小桶装满倒入大桶,大桶满了就倒空**」
—— 这个过程本质上是在做 **mod b 的加法**,最终会遍历所有 gcd 的倍数
③ 步数上界:约 b/gcd 步内一定能出现目标(所以状态空间有限、BFS 必收敛)四、逻辑推理类
8. 三筐水果标签全贴错,只拿一只水果,如何写对标签?
答:
三筐:标着【苹果】【橘子】【混合】,但标签【全部贴错】
★ 关键:因为"全部贴错",所以**标着"混合"的那筐绝不可能是混合**!
→ 它必定是"纯苹果"或"纯橘子"(信息量最大的一筐)
① 从标着【混合】的筐里拿一只水果
② 若拿出的是【苹果】:
→ 该筐实际是【苹果】
→ 剩下两筐标签是【苹果】【橘子】,且都贴错
· 标【橘子】的筐不能是橘子(贴错),也不能是苹果(苹果已确定)
→ 它是【混合】
· 标【苹果】的筐 → 是【橘子】
③ 若拿出的是【橘子】:对称推理 → 【橘子】/【混合】/【苹果】
答案(假设拿到苹果):
【混合】筐 → 苹果
【橘子】筐 → 混合
【苹果】筐 → 橘子思维要点(可迁移):
"全部贴错"是一个强约束,它把"标签"变成了"排除项"。所以从"约束最强的那一项"入手("混合"标签的筐最不可能真的是混合),一步就能确定,而不是盲目试。这是"优先利用约束最强的信息"的通用思路。
9. 五对夫妇握手,A 先生问其他人握手次数各不相同,A 太太握了几次?
答:
【已知条件】
· 共 10 人(5 对夫妇)
· 每个人【不与自己、不与配偶】握手 → 每人最多握 8 次
· A 先生问了【除自己以外的 9 个人】,得到的 9 个答案【互不相同】
【推导】
9 个人的答案互不相同,而取值范围只有 0~8 共 9 个值
→ 这 9 个答案必然是 **{0, 1, 2, 3, 4, 5, 6, 7, 8}** 的一个排列
① 握了 8 次的人,与除配偶外的所有人握过手
→ 除他自己的配偶外,所有人都至少握了 1 次
→ 所以"握 0 次的人"必然是【8 次的那个人的配偶】
(这两人的握手数之和 = 8,且他们有配偶关系)
② 去掉这一对。剩下 8 人中,"握 7 次"的人(除配偶外跟所有人都握过,
且他不可能跟"握 0 次"的人握过手)
→ 同理,"握 1 次的人"必然是【7 次的那个人的配偶】
(和为 8)
③ 依此类推,可以配对:
(8, 0)、(7, 1)、(6, 2)、(5, 3) —— 四对夫妇,
且每一对的握手数之和都是 8
④ 剩下唯一没有配对的数字是 **4**
→ A 先生与 A 太太必然构成最后一对,两人的握手数都是 4
(A 先生没有回答自己,所以 9 个答案中不含他的;而剩下的 4 只能是他的配偶)
【答案】**A 太太握了 4 次**思维要点:
核心技巧是"配对":9 个互不相同的值恰好覆盖 0~8,说明这些答案必然成对出现(和为 8),配对后剩下的唯一值就是答案。这类题的通用套路是「先确定取值范围 → 利用"取值恰好填满"推出配对关系 → 剩下的就是所求」。
10. 一人只说真话、一人只说假话,只问一个问题,如何判断哪条路通向目的地?
答:
题面条件(先澄清,避免答偏):
· 两条路:一条通向京城,一条通向小村
· 两个人:甲只说假话,乙只说真话;你【不知道谁是谁】
· 他们只回答"点头/摇头";你【也不知道点头代表"是"还是"否"】
· 只能问【一个问题】标准解法("双重否定"思想):
随便选一个人,问:
「 如果我问【另一个人】:'你身后这条路通向京城吗',他会回答'是'吗? 」
走法:
· 两人都【摇头】 → 走【这条路】
· 两人都【点头】 → 走【另一条路】为什么这样做有效(这是本题的核心):
★ 关键在于:**问"另一个人会怎么说",就把真假话的信息"套了两层",互相抵消**。
两种等价的标准问法(都有效):
① 「如果我问另一个人这条路通向京城吗,他会点头吗?」
→ 因为经过"假话者的否定"再经过"你再取反",最终指向真相
② 「这条路通向京城,当且仅当你会说真话 —— 对吗?」
(用"当且仅当"直接让真假话者说出同一答案)
★ 关于"不知道点头含义":
由于答案的"是/否"被点头/摇头映射遮蔽,但**"两人会给出相同动作"**这一点
始终成立;所以规则是:
**摇头 → 走被问的那条路;点头 → 走另一条**(或反之,取决于问法)
→ 更稳妥的表达:**问法固定后,"同一动作对应同一结论",只需事先约定映射即可**⚠️ 面试提醒:这道题的版本很多,"点头代表是/否是否已知"会改变最终的动作-结论映射。所以先澄清条件、再给出"两人动作必然一致"这一核心结论,比背一个具体映射更安全——面试官看的是推理过程。
11. 三块木牌(此路有宾馆/此路无宾馆/前两块一真一假),该走哪条路?
答: 这道题题面缺失一个关键条件,必须先指出来,否则答案不唯一。
题面:
三条路,各立一块木牌:
牌①:此路有宾馆
牌②:此路无宾馆
牌③:前两块牌子一真一假
以牌③为依据,哪条路有宾馆?条件化分析(严谨推理):
假设牌③为真(题目说"以③为依据")→ 牌①、牌②一真一假。分两种情况:
【情况 A】牌①真、牌②假
· 牌①真 → 路①有宾馆
· 牌②"此路无宾馆"为假 → 路②【也有】宾馆
→ 路①路②都有宾馆 —— **两种情况都自洽,无法排除**
【情况 B】牌①假、牌②真
· 牌①假 → 路①无宾馆
· 牌②真 → 路②无宾馆
→ 两条路都没有宾馆 → **宾馆在路③**
→ 仅靠题面,A 与 B 都成立 ⇒ **答案不唯一**,题目缺少条件。补上条件后答案唯一(这才是正确答法):
若题目补充「**三条路中只有一条有宾馆**」:
→ 情况 A 被排除(它有两条路有宾馆)
→ 只剩情况 B:路①无、路②无 ⇒ **宾馆在路③,走第三条路** ✅思维要点(面试价值):
「遇到自相矛盾或不唯一的逻辑题,第一反应是"题面是不是缺条件",而不是硬凑一个答案。」 面试中可以这样表述:
「如果补充"只有一条路有宾馆"这个条件,答案是走第三条路;如果不补充,牌①真牌②假的情况也自洽,所以题面本身不足以唯一确定。」
—— 这种回答体现的是严谨性,通常比给出一个"凑出来的答案"得分更高。
12. 假设法推理:谁偷吃了?今天星期几?
答: 这类题统一用假设枚举 + 验证一致性,核心是"逐个假设、看是否与所有条件同时成立"。
① 谁偷吃了(只有 1 人说实话)
四兄弟,只有 1 人说实话:
老大:老二吃的
老二:老四吃的
老三:我没吃
老四:老二说谎
【假设验证】唯一自洽的是「老三吃的」:
老大说"老二吃的" → 假(不是老二)
老二说"老四吃的" → 假(不是老四)
老三说"我没吃" → 假(正是老三)
老四说"老二说谎" → 真(老二确实说了假话)✅
→ 恰好 1 真 3 假,符合条件
【答案】**老三偷吃,老四说了实话**② 双胞胎说谎日(两人都答"昨天是我说谎的日子")
规则:哥哥 周一~周三 说谎,周四~周六 说真话,周日 说真话
弟弟 周四~周六 说谎,周一~周三、周日 说真话
推理:
① 今天不可能是周日:
周日两人都说真话,但"昨天(周六)是我说谎的日子"
· 对哥哥:周六他说真话 → 该句为假 → 与"周日说真话"矛盾 ✗
② 今天不可能是周一~周三、周五、周六(逐一代入会发现至少一方矛盾)
③ 今天 = 周四:
· 哥哥(周四说真话):"昨天(周三)是我说谎的日子" → 周三哥哥确实说谎 ✅ 成立
· 弟弟(周四说谎):他说"昨天是我说谎的日子"必须是假话
→ 昨天(周三)不是弟弟说谎的日子 → 周三弟弟确实说真话 ✅ 成立
【答案】**今天是星期四**可迁移的方法(这类题的通用流程):
自然语言
↓ 抽出命题("X 说 Y 为真")
布尔变量 + 约束("恰好 1 人为真"、"周三哥哥说谎")
↓
枚举所有情况 → 用约束逐一排除
↓
唯一解
⚠️ 关键动作:**先把"每天谁在说谎"整理成一张真值表**,再逐条代入验证。
这类题不要靠感觉,一律"列表 + 排除"。13. 52 张牌中有 10 张正面朝上,蒙眼分成两堆使正面数相同?
答:
【解法】
① 从 52 张中随便取出 **10 张**,作为 A 堆;剩下 **42 张**为 B 堆
② 设 A 堆中有 **x** 张正面朝上
③ 那么 B 堆中的正面数 = **10 − x**(总数 10 张正面)
④ 把 A 堆的 **10 张全部翻面** → A 堆正面数变为 **10 − x**
⑤ 于是 A 堆与 B 堆的正面数都是 **10 − x** ✅ 相等
(全程不需要看见任何一张牌)为什么有效(核心是"不变量"):
关键不变量:**两堆的"牌数之和"固定(10 + 42 = 52),正面总数固定(10)**
翻面操作的性质:在一堆 n 张牌中,若正面有 x 张,则反面有 (n − x) 张;
**整堆翻面后,正面数变为 n − x**(正面与反面互换)
所以只要我们构造出"取 n 张 + 全翻面",正面数就会从 x 变成 n − x。
令 n = 正面总数(10),则:
· B 堆正面数 = 10 − x (总数 10,A 拿了 x)
· A 堆翻面后正面数 = 10 − x (n − x,n 取 10)
→ 两堆正面数恒等 ✅ **且与 x 具体是多少无关**(这是它能"盲操作"的原因)可迁移的结论:
「这类题的抓手是找不变量(总量固定)+ 找一个能把"未知量"变成"已知表达式"的操作(这里是翻面)」。同类思想也用于"100 个开关/100 盏灯泡"这类题。
14. 100 个囚犯与灯泡:如何断定所有人都进过房间?
答:
题面:
· 100 个囚犯,房间里有 1 盏灯(初始【关】)
· 看守随机放囚犯进屋(保证每人会被放无穷多次),每次只能一人
· 进屋前大家可商量策略;进屋后【只能通过灯的开关状态交流】,不能留任何其他信息
· 目标:**某一天由某个人宣布"所有人(100 人)都至少进过房间一次",且声明必须正确**标准解法("计数者"策略):
为什么正确(三步论证):
| 论证 | 说明 |
|---|---|
| ① 不会虚增 | 计数者每关一次灯 +1,意味某个普通囚犯完成了"首次开灯";而每个普通囚犯最多开一次灯 → 计数器的值不可能被重复计数放大 |
| ② 达到 99 即完整 | 计数器 = 99 ⇒ 99 个普通囚犯各自至少开过一次灯 ⇒ 他们都进过房间;再加上计数者自己(他当然进过)⇒ 100 人全都进过 ✅ |
| ③ 一定会发生 | 看守保证每人被放无穷多次 → 每个普通囚犯终会遇到"进屋且灯是关的"的机会;计数者也会无穷多次进屋 → 计数器必然最终达到 99(只是时间可能很久) |
这道题的思维本质(面试要说的):
★ 核心是【用 1 bit 的空间实现 1 个 100 进制的计数器】
—— 灯只有开/关两种状态,但通过"谁在什么条件下改变它"的约定,
把"人数"编码进了"状态变化的次数"里。
★ 这是一个"分布式共识/终止检测"问题的玩具模型:
在只有极弱通信能力(1 bit、且不可靠的时序)的情况下,
如何让一群人知道"某个全局条件已满足"(终止检测 / Termination Detection)。
工程上类似问题:
· 分布式系统里的"全局快照/全局终止判定"(如 Flink 的 Checkpoint 完成判定,
需要等所有 task 上报 ack —— 本质是"计数者"思想的分布式版本)
· 分布式训练里的"barrier/同步点"三个高频追问:
| 追问 | 答案 |
|---|---|
| 如果灯初始状态未知? | 需要额外一轮约定(例如约定"第一天若有人进屋且灯亮则关灯并记录",或让计数者先统一状态),本质上要求存在一次"对齐状态"的机会 |
| 如果每个囚犯都被放"有限次"? | 可能永远无法完成(某个囚犯可能刚好每次都遇到"灯亮"),题目必须保证"无穷多次"才成立 |
| 如何加快速度? | 例如让普通囚犯在"已经开过一次灯"之后仍然在特定条件下操作(更复杂的计数方案),但会破坏"最多一次"的约束、需要更复杂的证明 —— 面试里说清"这是一个正确性优先的策略"即可 |
下一篇:《智力题(二)》聚焦概率、博弈、数学与综合名题——三门问题、两个孩子、贝叶斯与基数效应、两个罐子、100 苹果博弈、25 匹马找前三、病狗与黑帽的公共知识归纳、猴子搬香蕉、过桥问题、九点十线、镜子问题,最后给出「如何把智力题思维迁移到工程与系统设计上」的收尾方法。
