如果你参加过企业招聘的面试就会发现,除了正常的项目、八股文、场景设计、算法,还有一种题型同样活跃在面试场上,那就是智力题。这种题可能跟计算机知识相关也可能无关,可能会让你用代码表达出来,也可能只要一个解法或是思路。这篇文章给大家整理几道面试场上出现过的“脑筋急转弯”题目,如果你也遇到过类似的题目,记得点个赞吧。
白鼠试毒问题
首先是经典的小白鼠试毒问题。有1000瓶无色无味的液体,其中有999瓶是水,1瓶是毒药,老鼠喝到毒药之后需要1小时毒发身亡。问如果想在1个小时之内判断出哪瓶是毒药需要几只白鼠。
思考一下,每只小白鼠喝完液体的1小时之后都会有两种状态:要么活要么死,如果有n只小白鼠,那么就可以有种可能,也就能代表种状态,,,所以使用10只白鼠就可以判断了。
我们分别给这10只白鼠编号:A、B、C、D、E、F、G、H、I、J,同时给1000个瓶子分别按1~1000编号,1的2进制是0000000001,所以让J号老鼠喝1号瓶;2的2进制是0000000010,所以让I号老鼠喝2号瓶;3的2进制是0000000011,所以让I和J号老鼠一起喝3号瓶;假设遍历到第691号瓶,691的二进制是1010110011,那么让A、C、E、F、I、J号老鼠一起喝691号瓶,以此类推。
然后,我们在1小时之后看这10只老鼠的死活,当然撑死的不算。假设最后B、E、F三只老鼠死了,其他7只老鼠还活着,把这个状态转换成二进制就是0100110000,再转成十进制就是304,说明304号瓶是毒药。
蚂蚁碰撞问题
接下来看一下leetcode1503.所有蚂蚁掉下来前的最后一刻,题目如下
为了避免干扰,我们假设一个长度为5的木板上只有a1和a2两只蚂蚁,a1在1位置,向右运动,a2在3位置,向左运动。
1秒钟之后两只蚂蚁都来到了2位置,蚂蚁相遇后会同时改变移动方向并继续移动,所以a1开始向左移动,a2开始向右移动,速度不变。
按照题目的描述,实际发生的情况确实应该是这样没错,但我们思考一下,两只蚂蚁只是简单的交换了方向,每一只蚂蚁的速度和位置其实都没有变化。我们如果把a1和a2两只蚂蚁身份互换一下,就认为a1一直在向右走,a2一直在向左走,一直都没有换过方向,其实对结果并不会有任何影响。所以我们只需要假设蚂蚁的行进方向一直不变,判断每只蚂蚁走到边缘需要的时间,在所有的结果中取最大值即可。
这道题目的代码如下所示:
public int getLastMoment(int n, int[] left, int[] right) {
int max = 0;
for (int k : left) {
max = Math.max(max, k);
}
for (int k : right) {
max = Math.max(max, n - k);
}
return max;
}
强盗分配金币问题
最后来看一下著名的强盗分配金币问题,有5名强盗 (A、B、C、D、E) 分100个金币。他们决定从A开始提出分配方案,如果不能获得半数以上的支持,A将被处死,然后由B提出分配方案,依此类推。如果每一名强盗都足够聪明(当然这五个看面相就知道肯定非常聪明),那么A提出什么样的方案才能保证自己获得最多的金币,而且不会被处死?
我们从后往前推,假设现在场上只剩下了D、E两个人,无论D提出什么方案,E都会反对然后处死D,独吞100金币。所以当轮到C提方案时,C即使提出(100 / 0 / 0)的方案,D也一定会同意,最终2:1通过方案。
那么B也可以预见到这种情况,所以B会提出(98 / 0 / 1 / 1)的方案来赢得D和E的选票,最终3:1通过方案。
A也可以预见到这种情况,所以如果A提出(97 / 0 / 1 / 2 / 0)的方案就可以赢得C和D的选票,或者提出(97 / 0 / 1 / 0 / 2)的方案来赢得C和E的选票,最终3:2通过方案。
以上是我们给大家举例的几道面试场上的真题,其实类似经典的题目还有很多,比如谷歌面试经典的高楼扔鸡蛋问题,腾讯面试高频的赛马问题,还有烧绳计时问题等,我把题目列在下面,大家快来试试吧。
高楼扔鸡蛋问题
你有2个鸡蛋,从100层楼上往下扔,以此来测试鸡蛋的硬度。如果鸡蛋在20层没有摔碎,在21层摔碎了,那么鸡蛋不会摔碎的临界点就是20层。如何用最少的尝试次数,测试出鸡蛋不会摔碎的临界点?
赛马问题
- 25匹马,5条跑道,找最快的3匹马,需要跑几次?
- 64匹马,8条跑道,找最快的4匹马,需要跑几次?
- 25匹马,5条跑道,找最快的5匹马,需要跑几次?
如果这篇文章有帮助到你,请你帮我点一个免费的赞,这对我非常重要,谢谢!(手动鞠躬)
欢迎关注公众号:程序员冻豆腐, 里面有我所有的首发文章。