逻辑推理题:真假话与天平称重的套路拆解
有个学员上次面试栽在了一道天平称重问题上,回来跟我抱怨:
"面试官问,12枚金币里有1枚是假的,假的比真的轻,用天平称几次能找到假币。我说3次,他说不对。"
我问他:"你称了几次?"
他说:"第一次左边6个右边6个,第二次左边3个右边3个..."
我打断他:"你被称重次数束缚住了思维。称重不是切西瓜,不能每次对半分。"
这道题其实有更聪明的称法。今天把逻辑推理题最经典的两大类彻底讲透。
一、天平称重:假币问题的黄金解法 🔴
1.1 问题拆解
经典问题:
有12枚金币,其中1枚是假的,假的比真的轻。用天平称3次,如何找到假币?
1.2 ❌ 错误示范
候选人原话:"第一次一边放6个,轻的那边有假币。第二次一边放3个,轻的那边有假币。第三次一边放1个..."
问题诊断:
- 没有考虑"运气不好"的情况——如果每次都恰好均匀分布呢?
- 只考虑了称重次数,没考虑称重策略
- 不知道什么叫"最优称量策略"
面试官内心 OS:"能答出'每次对半称'的候选人,说明思维还停留在直觉层面,没想过有没有更优解。" :::
1.3 标准回答
核心思想:三分法——不是对半切,而是切成三堆。
第一次称重:
把12枚分成三堆:4个、4个、4个。
随便选两堆放上天平:
- 如果平衡:假币在第三堆(没称的那4个)
- 如果不平衡:假币在轻的那堆(4个)
无论哪种情况,称一次后,假币的范围缩小到 4枚。
第二次称重:
把4枚分成三堆:1个、1个、2个。
取1个和1个放上天平:
- 如果平衡:假币在2个那堆
- 如果不平衡:假币在轻的那1个
现在假币范围缩小到 1~2枚。
第三次称重:
如果是2枚,直接比较两个的重量,轻的是假币。 如果已经是1枚,那已经找到了。
最终结果:用 3次 一定能找到假币。
这道题的关键不是"对称几次",而是"每次怎么分组"。三分法比二分法更优,因为天平有三种结果(平衡、左倾、右倾),信息量更大。
1.4 追问升级
追问1:如果是9枚硬币,假币比真的轻,称几次?
答:三分法。
- 第一次:3、3、3,称两组3枚
- 第二次:剩下3枚,分1、1、1,称两组1枚
- 第三次:如果不平衡,轻的是假币;如果平衡,没称的是假币
- 共3次
追问2:如果是13枚呢?
答:13枚不能均分三份。分成 4、4、5:
- 第一次称 4 vs 4
- 如果不平衡:在轻的那4个里
- 如果平衡:在5个那堆里
- 第二次称量策略类似,仍然最多3次能称出
追问3:如果是假币比真的重,怎么称?
答:方法完全一样,只是轻/重判断反过来。
【面试官手记】 能想出三分法的候选人,说明他真正理解了天平的本质——不是比较重量,而是比较"相对轻重"。这种理解可以迁移到任何需要做决策判断的场景。 :::
二、真假话问题:谁是小偷?🔴
2.1 问题拆解
经典问题:
甲、乙、丙、丁四个人,其中一个人偷了东西。审讯时:
- 甲说:是乙偷的
- 乙说:是丙偷的
- 丙说:不是我偷的
- 丁说:我没偷
如果只有一个人说真话,谁是小偷?
2.2 ❌ 错误示范
候选人原话:"假设甲说的是真的...不对,这样乙说的也是真的...那就两个人说真话了..."
问题诊断:
- 假设甲说真话 → 乙是小偷 → 丙说"不是我偷的"也是真话 → 矛盾
- 没有系统地列举所有情况
- 假设法用得太随意
面试官内心 OS:"这种题目考的是逻辑推理的系统性。乱假设的候选人,说明思维没有条理。" :::
2.3 标准回答
方法:枚举法 + 矛盾排除
假设某个人是小偷,然后看每个人的话是否成立,统计说真话的人数。
假设甲是小偷:
- 甲说"是乙偷的" → 假(因为甲是小偷)
- 乙说"是丙偷的" → 假
- 丙说"不是我偷的" → 假(丙是小偷,但他说不是)
- 丁说"我没偷" → 真
- 真话数:1 ✓
假设乙是小偷:
- 甲说"是乙偷的" → 真
- 乙说"是丙偷的" → 假
- 丙说"不是我偷的" → 真
- 丁说"我没偷" → 真
- 真话数:3 ✗
假设丙是小偷:
- 甲说"是乙偷的" → 假
- 乙说"是丙偷的" → 真
- 丙说"不是我偷的" → 假
- 丁说"我没偷" → 真
- 真话数:2 ✗
假设丁是小偷:
- 甲说"是乙偷的" → 假
- 乙说"是丙偷的" → 假
- 丙说"不是我偷的" → 真
- 丁说"我没偷" → 假
- 真话数:1 ✓
有两个解?检查一下...
等等,题目说"只有一个人说真话"。上面甲和丁都是1个真话,再检查一遍:
丁是小偷时:
- 甲说"是乙偷的" → 假(因为丁是小偷)
- 乙说"是丙偷的" → 假
- 丙说"不是我偷的" → 真(确实不是丙偷的)
- 丁说"我没偷" → 假(但丁说没偷,实际上丁偷了)
- 只有丙说真话 → 1个真话 ✓
答案是 丁是小偷。
枚举法虽然看起来笨,但一定能找到答案。很多候选人觉得枚举太慢,想找捷径,结果绕来绕去绕不出来。面试时,枚举法是最可靠的。
2.4 追问升级
追问1:如果"只有一个人说假话",答案是什么?
答:枚举后发现只有乙是小偷时满足条件(甲真乙假丙真丁真 = 3个真话,不对)。
重新枚举...结果是 丙是小偷。
追问2:如果有两个人说假话呢?
答:继续枚举,会发现甲和丙都是1个假话的情况...
【面试官手记】 有个学员问我:"面试官要求5秒内答出来,是不是有更快的解法?"我说:"没有。但面试官不是要你5秒内答出来,是要看你怎么思考。慢慢来,把推导过程讲清楚,比蒙一个答案强一百倍。" :::
三、红眼睛问题:逻辑与共识的诡异 🟡
3.1 问题拆解
这道题是我见过最诡异的逻辑题:
有一个村庄,100个人中有5个红眼睛、95个蓝眼睛。他们非常聪明,能进行逻辑推理。村子里有一条规矩:知道自己眼睛颜色的人必须在当晚离开村庄。所有人都知道眼睛颜色有红有蓝,但因为共同知道的限制,没有人敢确定自己的颜色。有一天,一个游客无意中说了一句"你们村里有红眼睛的人",然后离开了。问:接下来会发生什么?
3.2 ❌ 错误示范
候选人原话:"他们之前就知道了啊,游客说的不是废话吗?所以什么都不会发生。"
问题诊断:
- 没有理解"共同知道"的含义
- 游客的话打破了某种信息壁垒
- 没有意识到"公共知识"的重要性
面试官内心 OS:"这道题能答对的候选人,连5%都不到。不是因为难,是因为它违反直觉。但真正答对的,说明他对'共识'和'知识'有很深的理解。" :::
3.3 标准回答
关键概念:共同知识(Common Knowledge)
游客没来之前,"村里有红眼睛的人"是每个人都已知的信息,但不是共同知识。
什么意思?
- 我知道村里有红眼睛
- 你也知道村里有红眼睛
- 但我知道"你知道"吗?不确定
- 因为我不知道你知道...
这个推理链条不断。
游客说了之后:
"你们村里有红眼睛"这句话,把"我知道"和"你知道"这件事,变成了所有人都知道所有人都知道所有人都知道...的无限循环。
这就是"共同知识"。
结果:
- 第5天晚上,5个红眼睛的人会一起离开。
- 如果是3个红眼睛,第3天晚上离开。
证明(数学归纳法):
- 如果只有1个红眼睛,他看到其他人都不是红眼睛,听到游客的话后知道自己一定是,当晚会离开。
- 如果有2个红眼睛,每个人都在等对方第一晚离开。没人离开说明不止1个,所以第2晚一起离开。
- 以此类推...
3.4 追问升级
追问1:如果游客说的是"你们村里有99个红眼睛",会发生什么?
答:结果不变。因为公共知识的内容不重要,重要的是"所有人都知道所有人都知道..."这个链条被建立了。
追问2:这道题和系统设计有什么关系?
答:分布式系统里的"共识算法"本质上就是建立共同知识。Paxos、Raft 都是在解决"我怎么知道别人也知道"这个问题。
【面试官手记】 能把这道题和分布式共识联系起来的候选人,我都给了P7。因为他不仅理解了逻辑,还理解了这个逻辑在实际工程中的意义。 :::
四、赛马问题:最快的5匹马 🔴
4.1 问题拆解
问题:
25匹马,5条赛道。每场比赛最多5匹马一起跑,但没有计时器,只能知道相对名次。最少需要几场比赛才能找出最快的5匹马?
4.2 标准回答
第一步:5场预选赛
把25匹马分成5组,每组5匹,跑5场。
每场比赛结果:每组内排出名次(1~5)。
第二步:1场半决赛
把每组的第一名拿出来,跑第6场。
结果假设:A1 > B1 > C1 > D1 > E1(A1是总第一)。
淘汰原则:
- D组和E组的全部淘汰(D1、E1输了,不可能进前5)
- C组只有C1可能进前5(C2~C5不可能了,因为已经有B1、A1了)
- B组B1可能进,B2~B5淘汰
保留候选:A1、B1、B2、C1(5匹)
第三步:1场决赛
让 A1、B1、C1、B2 跑第7场:
- 前两名直接晋级
- 剩下第3名的马所在的组,可能还有一匹能进
如果B2是第三名,那就再比较B2 vs C2(如果有理由的话)。
最终答案:7场。
这道题的关键是"动态淘汰"——不是每个组都要跑完,而是在每一步都淘汰不可能进前5的选手。这种"边推理边淘汰"的思路,在很多算法问题里都有应用。
4.3 追问升级
追问1:如果是找最快的3匹呢?
答:6场就够。先跑5场,再把5个第一名比较,选前3个分组,但还要再验证...
实际上最少需要6场或7场,取决于运气。
追问2:如果有100匹马呢?
答:思路类似,先分组,再逐层淘汰。
【面试官手记】 赛马问题和系统设计里的"分组淘汰赛"很像。比如TOP N问题,经常用分组淘汰来优化。 :::
五、逻辑推理万能公式
逻辑推理题的核心是"有条不紊"。枚举法虽然看起来笨,但一定有效。面试时不要怕枚举,要怕的是枚举的时候乱了手脚。
六、生产避坑
有人问:这些逻辑题和写代码有什么关系?
场景1:故障排查 "张三的电脑能上网吗?"——这就像天平称重,一步步缩小范围,直到找到问题。
场景2:缓存一致性问题 A说"我没读到脏数据",B说"我已经更新了",C说"我的请求被负载均衡到另一台机器了"。谁在说谎?这也是逻辑推理。
场景3:分布式事务 CAP理论、Lamport时钟、向量时钟,本质上都是逻辑推理在分布式系统里的应用。
【面试官手记】 能把这三个场景说出来的候选人,基本上都有实战经验。因为他能把看似抽象的逻辑题和真实的工程问题联系起来。 :::
七、工程选型
遇到逻辑推理类面试题,记住"三步走":
第一步:明确问题 是称重、真假话、还是其他类型?
第二步:选择方法
- 称重问题 → 三分法
- 真假话 → 枚举法
- 赛马/排名问题 → 分组淘汰
第三步:边推理边验证 每一步推理完检查是否有矛盾。