这是我参与更文挑战的第 14 天,活动详情查看 更文挑战
这个系列有点花头^o^,就是来拓展拓展思维,算是智力题吧,一般不会在面试中出现,但有的厂会出一些,据我所知我们这有的部门会问些这种,然后在群里说: "唉,又是全军覆没,-_-",我好奇地看了看群,把这个问题拿出来,虽然可以解出来,但是确实在有精神和时间压力的情况下应该是无法轻松做出。突然想起这件事,所以开了个栏目,希望能在面试中为你锦上添花。
首先,先端正下态度,1. 这种题做不出也没关系。这就是你该有的态度,2. 做不出答案,整理出思路也是好的,其实可能面试官就是看你面对难题和面对压力的反应,而不是题目本身,轻松面对,就当自己做不出来吧,也没啥大不了的。
我高中曾经在33IQ上一波通过了门萨测试,对自己还是较有信心,但随着时间的推移,愈发觉得耐心和毅力才是增长智慧的唯一法门,所以努力吧 ^-^
另外,天天看算法系列是不是有点无聊,调剂一下?
1. 核算检测
题目描述
有1000个旅客,有1人阳性混入其中,但现在试剂盒严重不足,只有10个,怎么才能把这个人找出来? 试剂盒可以重复使用,只要该试剂盒被阳性的人测了,那么就会10小时后就会变红。
思路
拿到这题我刚开始反应是,有没有解,是不是给我出了个脑筋急转弯 (比如某人有真实之眼) 其实根本没解,玩文字游戏啥的,但同事给我肯定有解的答案后,我就排除了无解的可能,开始认真思考这个问题。其实这也省了一波事,就怕有的同学直接就凭直觉觉得不可能,然后就往文字游戏方向越走越远了。
可能是数学专业,对数字比较敏感,幸运的我直接想到了正确的道路上,我的思路是
- 10盒要测1000人,
2 ^ 10 = 1024,恩,应该用到二进制了。 - 我从简单问题开始想起,不要上来就搞 1000,既然跟二进制相关,想到二分,我就先想 2人需要几个,4(
2^2)个人需要几个,8(2^3)人需要几个? - 分解问题
- 如何重复利用试剂盒,如何量化如何编号
- 如何找到那个人
如果是2个人,应该没啥好说,直接 1个试剂盒就够了,选第一个人测(编号 0),10小时后变红 => (0 是阳性) 否则,另一个人 (编号 1)是阳性。
如果是 4 人,我们给他们编号 0, 1, 2, 3, 而这些数可以用二进制对应表示成00, 01, 10, 11,我们可以看到,是2 位二进制可以表示,对应下图
试盒1 试盒2
人员编号
[0] 0 0
[1] 0 1
[2] 1 0
[3] 1 1
对应的,我们的试盒1 给人员编号 [2], [3]测试,试盒2 给人员编号 [1], [3]的人用。其实就是图中对应 1 的位置,表示使用试剂盒。10小时候我们观察结果。
无非有这几种可能:
`试盒1`变红 | `试盒1`未变红
`试盒2`变红 `[3] 阳性` | `[1] 阳性`
因为看上图只有[3] | 因为试盒2给[1]测过
2个盒子都给他试了 | 且[1]没有给试盒1测,其他都不满足
|
`试盒2`未变红 `[2] 阳性` | `[0] 阳性`
同理,你可以自行推测 | 反推,都没变红,如果是 [1],[2],[3]中
| 有人阳性,结果都不会是这样,盒子肯定有会红的
如果画成二叉树的话,就更清楚了:
root
/ \
试剂盒1 1变红 0未变红
/ \ / \
试剂盒2 1变红 0未变红 1变红 0未变红
路径 11 10 01 00
阳性编号 [3] [2] [1] [0]
至此,我们可以判断出,这个问题确实可以通过这种方法来找出谁是阳性,然后我们就可以拓展到 8 个人,据推理,应该能用 3个试剂盒检出,因为二进制 000 - 111可以表示 8 个人。=> 1000 确实可以用 10 盒测试出来。(2^10 > 1000),很好我们的思路走在了正确的道路上。
简单画下8人
试盒1 试盒2 试盒3
人员编号
[0] 0 0 0 000 二进制是 0
[1] 0 0 1 001 二进制是 1
[2] 0 1 0 :
[3] 0 1 1 :
[4] 1 0 0
[5] 1 0 1 101 二进制是 5
[6] 1 1 0 :
[7] 1 1 1
按照对应位置测试,如试盒1给 [4],[5],[6],[7] 安排上,测完等结果,
最后按照试剂盒结果的二叉树路径,找出最后的阳性患者。
root
/ \
0 [1] 试剂盒 1 结果假设 1
/ \ / \
0 1 [0] 1 试剂盒 2 结果假设 0
/\ /\ /\ /\
0 1 0 1 0 [1] 0 1 试剂盒 3 结果假设 1
说明编号 [5] 的人是阳性。
最后再还原成1000个人,我就不写了。
另外向大家着重推荐下另一个系列的文章,非常深入浅出,对前端进阶的同学非常有作用,墙裂推荐!!!核心概念和算法拆解系列 记得点赞哈
今天就到这儿,想跟我一起刷题的小伙伴可以加我微信哦 点击此处交个朋友
Or 搜索我的微信号infinity_9368,可以聊天说地
加我暗号 "天王盖地虎" 下一句的英文,验证消息请发给我
presious tower shock the rever monster,我看到就通过,加了之后我会尽我所能帮你,但是注意提问方式,建议先看这篇文章:提问的智慧