前端必刷思维题系列[1]

513 阅读5分钟

这是我参与更文挑战的第 14 天,活动详情查看 更文挑战

这个系列有点花头^o^,就是来拓展拓展思维,算是智力题吧,一般不会在面试中出现,但有的厂会出一些,据我所知我们这有的部门会问些这种,然后在群里说: "唉,又是全军覆没,-_-",我好奇地看了看群,把这个问题拿出来,虽然可以解出来,但是确实在有精神和时间压力的情况下应该是无法轻松做出。突然想起这件事,所以开了个栏目,希望能在面试中为你锦上添花。

首先,先端正下态度,1. 这种题做不出也没关系。这就是你该有的态度,2. 做不出答案,整理出思路也是好的,其实可能面试官就是看你面对难题和面对压力的反应,而不是题目本身,轻松面对,就当自己做不出来吧,也没啥大不了的。

我高中曾经在33IQ上一波通过了门萨测试,对自己还是较有信心,但随着时间的推移,愈发觉得耐心和毅力才是增长智慧的唯一法门,所以努力吧 ^-^

另外,天天看算法系列是不是有点无聊,调剂一下?

1. 核算检测

题目描述

有1000个旅客,有1人阳性混入其中,但现在试剂盒严重不足,只有10个,怎么才能把这个人找出来? 试剂盒可以重复使用,只要该试剂盒被阳性的人测了,那么就会10小时后就会变红

思路

拿到这题我刚开始反应是,有没有解,是不是给我出了个脑筋急转弯 (比如某人有真实之眼) 其实根本没解,玩文字游戏啥的,但同事给我肯定有解的答案后,我就排除了无解的可能,开始认真思考这个问题。其实这也省了一波事,就怕有的同学直接就凭直觉觉得不可能,然后就往文字游戏方向越走越远了。

可能是数学专业,对数字比较敏感,幸运的我直接想到了正确的道路上,我的思路是

  1. 10盒要测1000人,2 ^ 10 = 1024,恩,应该用到二进制了。
  2. 我从简单问题开始想起,不要上来就搞 1000,既然跟二进制相关,想到二分,我就先想 2人需要几个,4(2^2)个人需要几个,8(2^3)人需要几个?
  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,我看到就通过,加了之后我会尽我所能帮你,但是注意提问方式,建议先看这篇文章:提问的智慧

参考