智力题(不断更新)
转自:http://blog.csdn.net/hackbuteer1/article/details/6726419
1.你让一些人为你工作了七天,你要用一根金条作为报酬。金条被分成七小块,每天给出一块。如果你只能将金条切割两次,你怎样分给这些工人?
切割两次,分出三块 1、2、 4。
第一天 付1
第二天 收回1,付2
第三天 付1(1+2)
第四天 收回1、2 付4
第五天 付1 (4+1)
第六天 收回1 付2(4+2)
第七天 付1 (4+2+1)
2.有两个房间,一间房里有三盏灯,另一间房有控制着三盏灯的三个开关,这两个房间是 分割开的,从一间里不能看到另一间的情况。现在要求受训者分别进这两房间一次,然后判断出这三盏灯分别是由哪个开关控制的。
有什么办法呢?
根据灯泡的 热度 和 是否亮 两个状态可以分清三种情况。
3.有一个国家的人们只想要男孩,每个家庭都会一直要孩子,直到他们得到一个男孩。如果生的是女孩,他们就会再生一个。如果生了男孩,就不再生了。那么,多年以后男孩多还是女孩多(前提:每次生男孩儿和女孩儿的概率是一样的。)
这道题如果单单从概率的角度或者从个体的角度去分析,其实是很困难的,因为里面出现的情况有太多种了(其实,“转基因大白菜”网友的答案可以给我们一个启发,解这类问题,思考的角度应该从整体出发。)。所以,“转基因大白菜”网友的思路是假设总共有 X 户家庭 (这种思路非常的高明),因为每户家庭直到有了男孩儿才停止生育,所以,若干年后,所有的男孩数是 X。对于女孩儿来讲,第一批生育会产生 X/2 个女孩儿, 第二批生育会产生 X/4 个女孩儿, 第三批生育会产生 X/8个女孩儿,第n批生育会产生 X/2^n 个女孩儿。如果我们把所有的女孩儿加起来,当n趋于无穷时,所有的女孩儿个数是 X,与男孩儿的个数是一样的。(是不是觉得这种方法很不错,呵呵。)
4.一个矩形蛋糕,蛋糕内部有一块矩形的空洞。只用一刀,如何将蛋糕切成大小相等的两块?(内部的小矩形在大矩形的任意位置)
答案:注意到平分矩形面积的线都经过矩形的中心。过大矩形和空心矩形各自的中心画一条线,这条线显然把两个矩形都分成了一半,它们的差当然也是相等的。
5. 用线性时间和常数附加空间将一篇文章的单词(不是字符)倒序。(从字符串循环移位中得到的方法)
答案:先将整篇文章的所有字符逆序(从两头起不断交换位置相对称的字符);然后用同样的办法将每个单词内部的字符逆序。这样,整篇文章的单词顺序颠倒了,但单词本身又被转回来了。
6.一块矩形的巧克力,初始时由N x M个小块组成。每一次你只能把一块巧克力掰成两个小矩形。最少需要几次才能把它们掰成N x M块1x1的小巧克力?(防止惯性思维)
答案:N x M - 1次显然足够了。这个数目也是必需的,因为每掰一次后当前巧克力的块数只能增加一,把巧克力分成N x M块当然需要至少掰N x M - 1次。
7.32位整形数的二进制形式中1的个数
count = 0;
方法一:与二进制位数有关:while(b) { if(b%10 == 1) count++; b = b/10; }
方法二:与二进制中1的个数: while(b) { count++; b = b & (b-1);} //从低位到高位,依次让每个1为0
8.用一行C表达式判断某个数是2的幂
(b & (b-1) ) == 0
9.一个大小为N的数组,所有数都是不超过N-1的正整数。用O(N)的时间找出重复的那个数(假设只有一个)。一个大小为N的数组,所有数都是不超过N+1的正整数。用O(N)的时间找出没有出现过的那个数(假设只有一个)。
这种数据有限范围的问题用hash是最好的方案:(缺点是消耗O(N)的空间)
声明一个 Hash[N-1],初始全部为false,遍历数组,若为i,则置Hash[i] = true, 若查看发现Hash[i]已为true,说明i是重复的数,算法结束。
声明一个Hash[N+1], 初始全部为false,遍历数组,对i,置Hash[i] = true, 再遍历一遍Hash[n+1], 遇到哪个值为false,则相应值未出现过。
根据题目的条件,实际上在暗示用另外一种方法:(但这种方法容易出现越界错误!!!)
求N个元素的数组之和,减去1~N-1正整数的和,得到重复的数。
求1~N+1正整数的和,减去N元素数组之和,得到缺失的数。
10.地球上有多少个点,使得从该点出发向南走一英里,向东走一英里,再向北走一英里之后恰好回到了起点?
答案:“北极点”是一个传统的答案,(因为开始向南和最后向北走的距离相同,所以不论向东走了多少,最后都回到原地)其实这个问题还有其它的答案。
事实上,满足要求的点有无穷多个。所有距离南极点1 + 1/(2∏)英里的地方都是满足要求的(这里假定圆锥侧面与底部半径相等),向南走一英里后到达距离南极点1/(2∏)的地方,向东走一英里后正好绕行纬度圈一周,再向北走原路返回到起点。事实上,这仍然不是满足要求的全部点。距离南极点1 + 1/(2k∏)的地方都是可以的,其中k可以是任意一个正整数。(相当于在原地点绕行k圈)
11.A、B两人分别在两座岛上。B生病了,A有B所需要的药。C有一艘小船和一个可以上锁的箱子。C愿意在A和B之间运东西,但东西只能放在箱子里。只要箱子没被上锁,C都会偷走箱子里的东西,不管箱子里有什么。如果A和B各自有一把锁和只能开自己那把锁的钥匙,A应该如何把东西安全递交给B?
答案:A把药放进箱子,用自己的锁把箱子锁上。B拿到箱子后,再在箱子上加一把自己的锁。箱子运回A后,A取下自己的锁。箱子再运到B手中时,B取下自己的锁,获得药物。
12、两个机器人,初始时位于数轴上的不同位置。给这两个机器人输入一段相同的程序,使得这两个机器人保证可以相遇。程序只能包含“左移n个单位”、“右移n个单位”,条件判断语句If,循环语句while,以及两个返回Boolean值的函数“在自己的起点处”和“在对方的起点处”。你不能使用其它的变量和计数器。
答案:两个机器人同时开始以单位速度右移,直到一个机器人走到另外一个机器人的起点处。然后,该机器人以双倍速度追赶对方。程序如下。
while(!at_other_robots_start) {
move_right 1
}
while(true){
move_right 2
}
13、 如果叫你从下面两种游戏中选择一种,你选择哪一种?为什么?
a. 写下一句话。如果这句话为真,你将获得10美元;如果这句话为假,你获得的金钱将少于10美元或多于10美元(但不能恰好为10美元)。
b. 写下一句话。不管这句话的真假,你都会得到多于10美元的钱。
答案:选择第一种游戏,并写下“我既不会得到10美元,也不会得到10000000美元”。(悖论问题,如果只写的是“我不会得到10美元”,那a就是一个悖论。我们的目的是让a一定为假,并且只有在后面有很多个0的时候才会为假)
14、你在一幢100层大楼下,有21根电线线头标有数字1..21。这些电线一直延伸到大楼楼顶,楼顶的线头处标有字母A..U。你不知道下面的数字和上面的字母的对应关系。你有一个电池,一个灯泡,和许多很短的电线。如何只上下楼一次就能确定电线线头的对应关系?
答案:在下面把2,3连在一起,把4到6全连在一起,把7到10全连在一起,等等,这样你就把电线分成了6个“等价类”,大小分别为1, 2, 3, 4, 5, 6。然后到楼顶,测出哪根线和其它所有电线都不相连,哪些线和另外一根相连,哪些线和另外两根相连,等等,从而确定出字母A..U各属于哪个等价类。现在,把每个等价类中的第一个字母连在一起,形成一个大小为6的新等价类;再把后5个等价类中的第二个字母连在一起,形成一个大小为5的新等价类;以此类推。回到楼下,把新的等价类区别出来。这样,你就知道了每个数字对应了哪一个原等价类的第几个字母,从而解决问题。
15、某种药方要求非常严格,你每天需要同时服用A、B两种药片各一颗,不能多也不能少。这种药非常贵,你不希望有任何一点的浪费。一天,你打开装药片A的药瓶,倒出一粒药片放在手心;然后打开另一个药瓶,但不小心倒出了两粒药片。现在,你手心上有一颗药片A,两颗药片B,并且你无法区别哪个是A,哪个是B。你如何才能严格遵循药方服用药片,并且不能有任何的浪费?
答案:把手上的三片药各自切成两半,分成两堆摆放。再取出一粒药片A,也把它切成两半,然后在每一堆里加上半片的A。现在,每一堆药片恰好包含两个半片的A和两个半片的B。一天服用其中一堆即可。
16.(名人问题转自:http://blog.csdn.net/beiyeqingteng/article/details/7707485)
在一个房间里有 N 个人,其中一个是名人,所谓名人就是大家都认识他,但是他不认识任何人。其它人可能认识房间里面另外的一部分人。你可以问任何人问题,但是问题只能是:你认识 X 吗,对方回答 Yes or No. 请问最少要问多少个问题才能把名人找出来?
答案:我们从1开始,依次问他是否认识他的下一个,比如 2, 如果 1 说认识,那么 1 一定不是名人,2 有可能是名人; 如果1 说不认识,2 一定不是名人,1 却有可能是名人。这是这个方法巧的地方。所以,不管1 回答是还是不是,我们都可以确定其中一个不是名人,然后,我们继续问 可能是名人那一位 是否认识 3, 然后依次下去,直到第 N 个人。这样我们就可以只要问 (N - 1) 个问题就可以把名人找出来。