开发岗智力题集合

1 1000个人做核酸,有一个阳性,怎么快速查出来(二分法、编码法 - 二进制位)

首先我们整理一下题意,这里的快速查出来是指每个人都做完一次核酸后,使用的最少的核酸管的数量,这等同于求最少的检测次数。正常的思路是每一个人都使用一个核酸管,然后检测1000次,但是效率很低,可以看到平常做核酸的时候都是10人一管的,我们可以从这方面借鉴一下思路。

二分法

每500人一管,检测完这一管是阳则说明阳性在这500人中,否则在另外500人中,假设是阳,则继续对500人二分,250一管,再继续判断是否为阳性,随后再重复之前的二分步骤,直到检测到最后2个人的时候,则再检测两次就可以确定最终的阳性患者。时间复杂度由O(n)降低到了log(2,n),即最多检测10次就可知道患者编号

如果使用二进制位如何快速确定阳性

二进制位的方法可以这样实施:首先给每个人分配一个唯一的10位二进制编号(因为2的10次方是1024,足够分配给1000个人)。然后,对于每个二进制位,将该位为1的所有人的样本混合,然后进行检测。如果某次混合检测结果为阳性,那么阳性者的二进制编码在该位上为1。**通过10次检测,就可以确定阳性者的完整二进制编码,**从而找到阳性者。

为什么最多通过10次检测就可以确定阳性患者的完整二进制编码?

核心原理:因为阳性患者的所有为1的二进制位参与检测时,其所在组使用的溶液管都会是阳性,如果不为阳性,则定为0,如果为阳性则记为1

使用二进制位检测方法,我们需要对每一个二进制位都进行一次混合检测。假设我们有一个10位的二进制编码,因此我们需要进行10次检测,每次检测对应一个二进制位。如果某次混合检测结果为阳性,那么阳性者的二进制编码在该位上为1。

在这10次检测完成后,我们可以得到阳性者的二进制编码。比如说,如果我们发现第2、4、7位的检测结果为阳性,那么阳性者的二进制编码在这三个位上为1,其他位上为0。这样,我们可以根据这个二进制编码找到阳性者。

因此,总共需要进行10次检测,每次检测对应一个二进制位。通过这10次检测,我们可以确定阳性者的身份。我之前的解释可能没有充分明确这一点,对此我深感抱歉。

现实中推荐的方法

每一百人混合检测到一根试管中,只需要最多检测10就能确定阳性在哪一组,最后再分成10组,每组10人,检测10次就能确定最终的阳性患者所在的组,针对最后这10组可以分别检测一次,这样就确定了最终的患者编号,最多共检测30次即可

2 找出重量不一致的球

给你一个天平 没有砝码 给你9个小球 其中8个小球重量是一样的 1个比较轻 怎么快速找到这个轻的球;升级:假设你不知道另外的1个小球是轻还是重

第一种情况:我们知道那个轻球是轻的。我们可以这样操作:将9个球分为三组,每组3个。然后用天平称两组,如果平衡,则轻球在未称的那一组,否则轻球在较轻的那一组。然后将这一组的三个球继续分,称重找轻球。

升级:假设你不知道另外的1个小球是轻还是重

我们不知道那个不同的球是轻还是重。这时候我们需要先将9个球分为三组,每组3个。然后称两组,如果平衡,则特殊球在未称的那一组,我们不知道它是轻还是重。但如果不平衡,我们就知道那个不同的球在这两组中,并且我们知道它是轻还是重。然后我们可以按照第一种情况的方法找出特殊的球。

给你一个天平 没有砝码 给你9个小球 其中7个小球重量是一样的 2个比较轻但是质量也不一样, 怎么快速找到这个两个轻球中的任意一个

第一步,你可以将这9个球分为3组,每组3个球。然后,使用天平对其中的两组进行比较。有两种可能的情况:

  • 如果两组的重量一样,那么两个轻球肯定在未称重的那组里。这时候,你需要把这组里的3个球进行比较,方法如下:先比较其中的两个,如果它们的重量一样,那么第三个就是轻球;如果不一样,那么较轻的那个就是轻球。

  • 如果两组的重量不一样,那么最轻球肯定在较轻的那组里。这时候,你需要把这组里的3个球进行比较,方法和上面一样。

你可能感兴趣的:(算法,大厂智力题)