无意中看到的些智力题,觉得有趣,整理下来。
1. 100层楼,给你两个鸡蛋,怎么确定在哪一层是摔坏的,而在那一层之下不会碎?
1)首先假设在X层碎,如果碎了,就将第二个鸡蛋从1~x-1进行遍历的摔,如果没有碎,那么第二次就在x+(x-1)层摔
因为我们假设通过x步得到答案,我们在x层用了一次,那么还剩下x-1步,所以选择x+(x-1)步,如果碎了,就能通过x-2步遍历x+1 ~ x+(x-1)-1的所有楼层
2)假如在x+(x-1)层碎了,那么继续,遍历x+1~ x +(x-1)-1
3)没碎就在x+(x-1)+(x-2)层摔
一直操作,直到碎掉
所以楼层公式为x(x+1)/2
2.岛上有群人,各自戴着红帽子或者白帽子,但都不知道自己帽子颜色,只有知道自己帽子颜色,第二天才能出岛,这时候有个人进来说了句“你们之中至少有一个人戴了顶红帽子”
问岛上的人最后的离开情况
如果有n个红帽子,那么第n+1天后红帽子的都能走掉,n+2天后白帽子的都能走掉,原因:假如只有一个红帽子,那么戴红帽子的第二天就会走,因为他发现自己面前的人第二天还没走,但是他能看到对面的人戴的什么帽子,这个时候对面知道我戴的是红帽子,他也就能推出它自己戴的是白帽子,所以它不会走,那么我就知道我是红帽子,那么我就可以走了。假如是两个红帽子,这两个红帽子都不能确定自己的状态,所以第二天都不会走,但是假如这两个人都发现第二天对方没走,那么就能知道自己戴的是红帽子,所以第三天红帽子走,第四天白帽子全走,以此内推
3.总共100个球,两个人分别拿,至少拿1个最多拿5个,你先拿怎么保证总能拿到第100个?
假如最后我拿了之后剩余的是1——5个,那么最后一个肯定是对方拿到了,而我假如最后拿了剩6个,那么无论对方怎么拿我都能保证第100个是我拿的,接着想假如我剩了12个,那么无论对方怎么拿我都能够将个数减到6个,所以我觉得只要我先拿然后每次保证剩余个数是6的倍数就行了
4.小明一家五口人喜欢探险,一天黑夜,他们被困在一座悬崖之上,好在他们发现了一座独木桥,但是他们唯一能照明的手电只能亮二十九秒了。小明过桥需要 3 秒钟,小明的爸爸只要1 秒钟,妈妈需要 6 秒钟,爷爷需要 8 秒钟,而奶奶则需要 12 秒钟,他们必须在这二十九秒内全部过河,但独木桥最多一次能承重 2 个人,同时必须保证在独木桥上的人有手电照明,应该如何安排过桥顺序呢?
思路:返回时用时间耗费最少的人。
爸爸拿手电和小明过去,3s
爸爸拿手电筒回来:1s
手电筒给爷爷奶奶,12s
手电筒给小明,小明回来:3s
手电筒给爸爸妈妈:6s
爸爸回来:1s
爸爸和小明过去:3s
总共29s
5.一个ip和海量ip黑名单,怎么判断ip是否在黑名单中?
使用布隆过滤器。它有一个位数组和k个哈希函数,我们先使用k个哈希函数对这个ip进行k次计算,就能够得到k个哈希值了,然后根据得到的哈希值去判断位数组中对应下标的值是否为1,如果都为1,那么就在布隆过滤器中,只要有一个不为1,那么就不在。但是布隆过滤器可能存在误判(也就是说如果某个元素存在,那么可能是误判,但是某个元素不在,那么就一定不在)。这个时候可以通过设置白名单来结果误判的问题
不适用位图的原因是因为位图法所占空间随着集合内最大元素的增大而增大,假如查找的元素数量少但是值特别大,那么就会特别浪费空间
6.海量数据找中位数
首先对海量数据进行分份,然后遍历每一份中的所有数据,每个数据用位运算去除最高的8位,然后根据最高的8位的值确定放入哪个桶里,再把每个桶写入一个磁盘文件中,并且统计每个桶内数据的数量,计算中位数是在哪个桶中,再把该桶中的数据读到内存中,以内存中整数的次高8bit又进行一次桶排序,和第一步相同的操作,一直这样知道字节是(0——7bit),这个时候再在内存中进行一次快排就行了
7. 140克的盐,给你一个天平,一个2g砝码,一个7g砝码,只称三次,称出50g的盐。
(1)2g 7g砝码放在左盘,从140g中取出盐放在右盘,天平平衡时,就称出了9g盐,分成了两份:9g,131g
(2)2g 7g砝码,9g盐(当砝码用)放在左盘,从131g中取盐放在右盘,天平平衡时,就称出了18g盐,分成了三份:9g,18g,113g
(3)7g砝码,18g盐(当砝码用)放在左盘,在右盘先放2g砝码,再从113g 中取出盐放进右盘,天平平衡时,就称出了23g盐,分成了四份:9g,18g,23g,90g.
(4)再把9g,18g,23g放在一起,就把140g分成了50g和90g.