常见面试智力题

本文最后更新于:2023年3月19日 晚上

赛马次数

有 25 匹马和 5 条赛道,赛马过程无法进行计时,只能知道相对快慢。问最少需要几场赛马可以知道前 3 名。

先把 25 匹马分成 5 组,进行 5 场赛马,得到每组的排名。再将每组的第 1 名选出,进行 1 场赛马,按照这场的排名将 5 组先后标为 A、B、C、D、E。可以知道,A 组的第 1 名就是所有 25 匹马的第 1 名。而第 2、3 名只可能在 A 组的 2、3 名,B 组的第 1、2 名,和 C 组的第 1 名,总共 5 匹马,让这 5 匹马再进行 1 场赛马,前两名就是第 2、3 名。所以总共是 5+1+1=7 场赛马。
A 组:1,2,3,4,5
B 组:1,2,3,4,5
C 组:1,2,3,4,5
D 组:1,2,3,4,5
E 组:1,2,3,4,5

用绳子计时 15 分钟

给定两条绳子,每条绳子烧完正好一个小时,并且绳子是不均匀的。问要怎么准确测量 15 分钟。

  • 点燃第一条绳子 R1 两头的同时,点燃第二条绳子 R2 的一头;
  • 当 R1 烧完,正好过去 30 分钟,而 R2 还可以再烧 30 分钟;
  • 点燃 R2 的另一头,15 分钟后,R2 将全部烧完。

砝码秤盐

140g 盐,一天平,7g 、2g 砝码各一个,如何只利用这些东西 3 次把盐分成 50g 和 90g?

  • 第一次: 7g、2g 砝码称出 9g 盐,结果盐分成 9g 与 131g

  • 第二次:将 9g 盐与 7g、2g 都作为砝码,结果将盐分为 18g 与 113g (注意:这时盐已经分为三份:9g、18g、113g,还有两个砝码)

  • 第三次:将 18g 盐与 7g 砝码发在左托盘,将 2g 砝码放在右托盘,然后在 113g 盐中取盐添置右托盘中,可获取 23g 盐。

这时盐分为 9g,18g,23g 与 90g。

即三次,可以得到 90g 与(9+18+23)50g。

九球称重

有 9 个球,其中 8 个球质量相同,有 1 个球比较重。要求用 2 次天平,找出比较重的那个球。

将这些球均分成 3 个一组共 3 组,选出 2 组称重,如果 1 组比较重,那么重球在比较重的那 1 组;如果 1 组重量相等,那么重球在另外 1 组。
对比较重的那 1 组的 3 个球再分成 3 组,重复上面的步骤。

药丸称重

有 20 瓶药丸,其中 19 瓶药丸质量相同为 1 克,剩下一瓶药丸质量为 1.1 克。瓶子中有无数个药丸。要求用一次天平找出药丸质量 1.1 克的药瓶。

可以从药丸的数量上来制造差异:从第 i 瓶药丸中取出 i 个药丸,然后一起称重。可以知道,如果第 i 瓶药丸重 1.1 克/粒,那么称重结果就会比正常情况下重 0.1 * i 克。

得到 4 升的水

有两个杯子,容量分别为 5 升和 3 升,水的供应不断。问怎么用这两个杯子得到 4 升的水。

可以理解为用若干个 5 和 3 做减法得到 4。

  • 不能从 3 做减法得到 4,那么只能从 5 做减法得到 4,即最后一个运算应该为 5 - 1 = 4,此时问题转换为得到 1 升的水;
  • 1 升的水可以由 3 做减法得到,3 - 2 = 1,此时问题转换为得到 2 升的水;
  • 5 - 3 = 2。

扔鸡蛋

一栋楼有 100 层,在第 N 层或者更高扔鸡蛋会破,而第 N 层往下则不会。给 2 个鸡蛋,求 N,要求最差的情况下扔鸡蛋的次数最少。

可以将楼层划分成多个区间,第一个鸡蛋 E1 用来确定 N 属于哪个区间,第二个鸡蛋 E2 按顺序遍历该区间找到 N。那么问题就转换为怎么划分区间满足最坏情况下扔鸡蛋次数最少。
E1 需要从第一个区间开始遍历到最后一个区间。如果按等大小的方式划分区间,即 E2 的遍历次数固定。那么最坏的情况是 N 在最后一个区间,此时 E1 遍历的次数最多。为了使最坏情况下 E1 和 E2 总共遍历的次数比较少,那么后面的区间大小要比前面的区间更小。具体来说,E1 每多遍历一次,E2 要少遍历一次,才使得 N 无论在哪个区间,总共遍历的次数一样。设第一个区间大小为 X,那么第二个区间的大小为** X-1,以此类推。那么 X + (X-1) + (X-2) + … + 1 = 100,得到 X (X + 1) / 2 = 100 ,即 X = 14。**
转自:https://blog.csdn.net/abe_abd/article/details/77710356
试着从 10 楼开始扔鸡蛋,然后是 20 层,30 层……100 层
如果鸡蛋 1 在第十层(随便举例子的一个数值也可以是别的数,看到后面就会知道这个值应该取 14,但是刚开始分析谁也不知道该取 14 不是么)扔下,鸡蛋摔碎。那么第二个鸡蛋只需要从 1-9 层依次扔下去试就能试出来是 1-10 中的第几层,所以最差在恰好在第十层才能摔碎,结果是 1+9=10 次
如果鸡蛋 1 在第 100 层是才摔碎,实验楼层依次是:10 层、20 层、30 层、、、100 层,试验了 10 次。在第 90 层时鸡蛋没有摔碎,但是在 100 层摔碎了。这说明 N 在[90,100]区间内,所以鸡蛋 2 只需要从 91 层楼开始试验,最差一直试验到 99 层必然会测试出 N 的值。最差次数:鸡蛋 1 的次数 10 次 + 鸡蛋 2 的次数 9 次 = 19 次。
设计一种扔鸡蛋的方法,使得扔鸡蛋 1 的次数无论是第一次还是最后一次扔下的次数越稳定越好。
负载均衡方法:扔鸡蛋 1 的次数 和扔鸡蛋 2 的次数的和 不论什么时候都是一样的,鸡蛋 1 多扔一次鸡蛋 2 就少扔一次,假如开始扔鸡蛋 1 的初始楼层是 x 层,那么扔鸡蛋 2 初始楼层是由扔鸡蛋 1 是否摔碎决定的。即,鸡蛋 1 摔碎的那一楼层 和 扔鸡蛋 1 的摔碎之前扔的那一次楼层数之间的差值减 1(假设鸡蛋 1 从 20 层开始扔下,没碎;从 30 层扔下,碎了,那么鸡蛋 2 就得从 21 层开始扔,最差一直扔到 29 层就能判断出 N 的值了),如果在 x 层扔下没碎,那么下一次扔的楼层就是 x+x-1 层(第一次是 20 层,下一次就是 20+20-1=39 层)鸡蛋 2 的次数相应的就减去 1 次;第二次没碎,下次从 x+ x-1 + x-2 层扔下(承接上面括号的例子:20+19+18 = 57 层),依次类推…..
也就是 : x +  (x-1)+ (x-2)+。。。+1=100 求一下 x 值   x =  14.先从 14 层往下扔,没碎的前提下再从 14+13=27 层往下扔。最差的情况下就是第一次在 14 层恰好摔碎了,鸡蛋 2 只需要从 1-13 层个扔一次就能判断出 N 的值了