1.真币重还是假币重?

问题:

有100个真币和1个假币,只知道真币与假币不等重,要求只称两次,得出是真币重还是假币重。

答案:

1),各取50个币放在天平两边。
2),如果同样重,则说明这100个都是真币,另外一个是假币。任取一个真币和假币比较重量即可。
3),如果不同重,则说明假币在这个100个当中。将比较重的一边的50个分成两个25,放在天平两端比较重量。如果同重,则说明假币在另外50个中,假币比较轻;如果不同重,则说明假币在这50个中,假币比较重。

2.海盗分金币

问题:

有5个海盗,按照等级从5到1排列。最大的海盗有权提议他们如何分享100枚金币。但其他人要对此表决,如果多数(所有人中的多数)反对,那他就会被杀死。他应该提出怎样的方案,既让自己拿到尽可能多的金币又不会被杀死?

答案:

分配方案是98,0,1,0,1。
5级海盗会不会被杀死,取决于5级海盗死后其他海盗是否会获得更多的利益。如果可以获得更多的利益,则肯定会反对,如果会获得更少的利益,则肯定会支持,如果利益没有变化,则反对或支持都可以。
如果5级海盗死了,则有4级海盗分配,4级海盗面临同样的问题,需要看自己死后的利益分配变化。然后是3级海盗,2级海盗。
2级海盗无论提出什么方案,都不会有多数人反对(自己支持,另一个人反对不能构成多数反对)。所以2级海盗肯定会提出100,0的分配方案,自己独享所有金币。
猜到2级海盗的分配方案后,3级海盗会提出99,0,1的分配方案。这样1级海盗因获得了比2级海盗方案中更多的金币,所以会支持3级海盗的方案。
猜到3级海盗的分配方案后,4级海盗会提出99,0,1,0的分配方案。这样2级海盗获得了比3级海盗方案中更多的金币,所以会支持4级海盗的方案。
猜到4级海盗的分配方案后,5级海盗会提出98,0,1,0,1的分配方案。这样1级海盗和3级海盗获得了比4级海盗方案中更多的金币,所以会支持5级海盗的方案。


3. 有25匹马,每次比赛只能有5匹马参加,问最少进行几次比赛才可以得到25匹马中跑得最快的前3名?

错误:需要8次。
+5--比赛过程类似胜者树的结构,5次比赛可以得到5个小组的名次;
+1--将5个小组头名进行比赛得到第一名。
+1--从第一名原来的小组抽出该组第二名与次回合的4匹马再比一轮,得到5匹马的第1名为总的第二
+1--循环上一步操作可得第三名

实际上只需要7次就够了:
首先将马分成a,b,c,d,e 5个组,每组5匹,每组单独比赛。然后将每组的第一名放在一起比赛。假设结果如下
a0,a1,a2,a3,a4
b0,b1,b2,b3,b4
c0,c1,c2,c3,c4
d0,d1,d2,d3,d4
e0,e1,e2,e3,e4
其中a, b,c,d,e小组都是按照名次排列(速度a0>a1>a2>a3>a4, b0>b1....)。并第6次比赛的结果为a0>b0>c0>d0>e0。
那么第6次比赛结束后,我们知道最快的一匹为a0。
我们知道第2名的马一定是a1或者b0,所以在接下来的比赛中要包含这两匹马。
 如果a1快,那么第3名是a2或者b0,
 如果b0快,那么第3名是a1,b1或者c0。
也就是说第2名和第3名一定在a1,a2,b0,b1和c0当中,所以在第7场比赛中包括这5匹马就可以得到第2名和第3名。

所以7次比赛就可以获得前3名的马。

4. 有三个酒杯,其中两个大酒杯每个可以装8两酒,一个可以装3两酒。现在两个大酒杯都装满了酒,只用这三个杯子怎么把酒平均的分给4个人喝?

为了平均,每个人需要喝4两。考虑到我们有一个3两的杯子,所以问题的关键是如何量出尽可能多的1两。
由于3*3-8=1,我们可以将3杯3两倒入8两杯中,剩下的就是1两。用这个方法,我么可以在总数为9两,10两和11两时3次量出1两酒。
所以解题步骤就成为首先量出3两和2两,这时剩下11两,然后量出3次1两酒,然后再2次量出3两酒,最后剩下2两。

假设下面的三个数是8两,8两和4两酒杯中的酒。
8 8 0
8 5 3
第一个人先喝3两,变成
8 5 0
8 2 3
第二个人先喝2两,变成
8 0 3
8 3 0
5 3 3
5 6 0
2 6 3
2 8 1
第一个人再喝1两,就刚刚喝了4两,变成
2 8 0
0 8 2
0 7 3
3 7 0
3 4 3
6 4 0
6 1 3
第三个人先喝1两,变成
6 0 3
8 0 1
第四个人先喝1两,变成
8 0 0
5 0 3
第三个人再喝3两,就刚刚喝了4两,变成
5 0 0
2 0 3
第二个人再喝2两,就刚刚喝了4两,变成
0 0 3
第四个人再喝3两,就刚刚喝了4两

5. 有1000瓶水,其中有一瓶有毒,小白鼠只要尝一点带毒的水24小时后就会死亡,至少要多少只小白鼠才能在24小时时鉴别出那瓶水有毒?

最初的想法:

假设共有n瓶水,m只小白鼠。让每k只喝同一瓶水,则有C(m,k)种组合,只要使得C(m,k)>=n, 每种组合对应喝某一瓶水即可。要m最小C(m,k)尽可能大,则k=m/2
题中n=1000,则C(12,6)=924, C(13,6)>1000,所以至少有13只小白鼠。

但这个思路只想到每瓶水都由k只小白鼠喝(最坏情况下死的小白鼠最少^^),其实可以不平均分配

答案:

m只小白鼠最大可以表示2^m种状态。问题关键在如何将状态和哪瓶水有毒对应起来。
作者给出 第一只小白鼠喝第1到2^(m-1)瓶,第二只小白鼠喝第1到第2^(m-2)和第2^(m-1)+1到第2^(m-1) + 2^(m-2)瓶....以此类推。没看懂。

这里给一种对应关系,刚好倒回来,每瓶水对应哪些小白鼠?
将水瓶贴上标签1,2,3,...,n
将其表示成二进制即可, 如
第1瓶水,1 = 2^0 由第1只小白鼠喝
第2瓶水,2 = 2^1 由第2只小白鼠喝
第3瓶水,3 = 2^1+2^0 由第1,2只小白鼠喝
第512瓶水,512 = 2^9 由第9只小白鼠喝

回到此题,1000瓶水需要最少10只小白鼠。

6. 判断数字是否出现在40亿个数中

问题:

给40亿个不重复的unsigned int的整数,没排过序的,然后再给几个数,如何快速判断这几个数是否在那40亿个数当中?

答案:

unsigned int 的取值范围是0到2^32-1(Java int型为有符号数,也包含2^32个数)。我们可以申请连续的2^32/8=512M的内存,用每一个bit对应一个unsigned int数字。首先将512M内存都初始化为0,然后每处理一个数字就将其对应的bit设置为1。当需要查询时,直接找到对应bit,看其值是0还是1即可。

7. 诚实国和说谎国 

问题:
一个岔路口分别通向诚实国和说谎国。来了两个人,已知一个是诚实国的,另一个是说谎国的。诚实国永远说实话,说谎国永远说谎话。现在你要去说谎国,但不知道应该走哪条路,需要问这两个人。请问应该怎么问?

解答:
问“你的国家怎么走?” 他们都会指向诚实国。

分析:
如果问“哪边是诚实国?”或者“哪边是说谎国?”这样的问题,由于正确答案只有固定的一边,所以两个人给出的答案必定不同。
所以只能问对每个人有不同正确答案的问题,比如“你的国家在哪边?”或者“他的国家在哪边”。对应着两个问题,诚实国的人会给出诚实国方向和说谎国方向,说谎国的人也会给出诚实国和说谎国方向。这样我们就可以判断哪边是诚实国,哪边是说谎国了。

8.称球问题

问题:
你有8个一样大小的球,其中7个的重量是一样的,另一个比较重。怎样能够用天平仅称两次将那个重一些的球找出来。

 

解答:
先取6个,天平上一边3个,同重则称剩余2个即可;不同重,则取重的3个中的2个来称。

 

分析:
此题可以通过倒推法来解决。
如果我们知道重球在某两个球中,则可以通过天平两边各放一个,比较重量发现重球。
如果我们知道重球在某三个球中,则可以通过天平两边各放一个,如果一样重,则第三个球是重球,否则天平上较重的即是重球。
如果我们知道重球在大于等于四个球中,则不能通过一次称重发现重球。
所以通过第一次称重,我们必须将重球限定在某两个或三个球当中。另外,天平两端放的球数应该相等,否则结果基本没有意义。
满足两端球相等的所有可能的比较方法
左,右
1, 1
2, 2
3, 3
4, 4
再考虑到必须将重球限定在2或3个球中,第一次只能采取3,3的比较方法。

此题还可以扩展一下:在m只大小相同的球中,m-1只重量相同,另外一只比较重。问需要用天平称多少次才能将重球找出来?
从上面的分析中可以知道,称一次最多可以
- 将重球从3个球中找出来。
- 将重球从9个球中限定在3个球中。
- 将重球从27个球中限定在9个球中。
.....
所以,称n次最多可以将重球从3^n中找出来。倒推回去也就可以获得m个球需要称多少次。

9. 切金条付工资
问题:
你让工人为你工作7天,回报是一根金条,这个金条平分成相连的7段,你必须在每天结束的时候给他们一段金条。如果只允许你两次把金条弄断,你如何给你的工人付费?

解答:
将金条切成1/7,2/7,4/7。
第一天给1/2,第二天给2/7并取回1/7,第三天给1/7,第四天给4/7并取回1/7和2/7,第五天给1/7,第六天给2/7并取回1/7,第七天给1/7。

分析:
这个题目的关键是要认识到,可以让工人给找零(当然,需要工人有零)。认识到这个问题后,具体的切法就顺理成章的出来了。

10. 蚂蚁爬杆

问题:

有一根27厘米长的细木杆,在第3厘米,7厘米,11厘米,17厘米,23厘米这五个位置上各有一只蚂蚁,木杆很细,不能同时通过两只蚂蚁,开始时,蚂蚁的头朝向左还是右是任意的,他们只会朝前走或掉头,但不会后退,当两只蚂蚁相遇后,蚂蚁会同时掉头朝反方向走,假设蚂蚁们每秒钟可以走1厘米的距离。求所有蚂蚁都离开木杆的最小时间和最大时间。

答案:

两只蚂蚁相遇后,各自掉头朝相反方向走。如果我们不考虑每个蚂蚁的具体身份,这和两只蚂蚁相遇后,打个招呼继续向前走没有什么区别。
所有蚂蚁都离开木杆的最小时间为
max(min(3, 27-3), min(7, 27-7), min(11, 27-11), min(17, 27-17), min(23, 27-23)) = 11
所有蚂蚁都离开木杆的最大时间为
max(max(3, 27-3), max(7, 27-7), max(11, 27-11), max(17, 27-17), max(23, 27-23)) = 24

11. 谁会拿到最后一个硬币

问题:

16个硬币,A和B轮流拿走一些,每次拿走的个数只能是1,2,4中的一个数。谁最后拿硬币谁输。
问:A或B有无策略保证自己赢?

答案:

B可以保证自己赢。
如果A拿1个,则B拿2个;如果A拿2个,则B拿1个;如果A拿4个,则B拿2个。这样每次AB加起来都是3或者6,所以最后会剩下1个或4个。如果是1个则A直接输了;如果剩下4个,A全拿则输了,如果不全拿,B继续采取上面的策略,最后还是剩下1个,还是A输。

 

转自博客:IT面试题 有编辑