下面举例一道比较灵活的面试题:
有8瓶水,其中有1瓶水有毒。先需要若干小白鼠尝试饮用每一瓶水,试问至少需要几只小白鼠能够将有毒的水找出来?
这道题的确可以用传统的方法——安排8只小白鼠一个个试喝。但是这样子的效率肯定相当低下。因此我们要考虑下有没有更好的办法。
我们给所有的水编号0-7,将0到7之间的数转化为二进制如下:
十进制 | 二进制数 |
---|---|
0 | 000 |
1 | 001 |
2 | 010 |
3 | 011 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
每只小老鼠有两种状态:中毒与不中毒。当每个数化为二进制之后,将这些毒水按照二进制位是否为1混合起来,然后让小白鼠按照如下表格试喝:
十进制 | rat[2] | rat[1] | rat[0] |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 |
2 | 0 | 1 | 0 |
3 | 0 | 1 | 1 |
4 | 1 | 0 | 0 |
5 | 1 | 0 | 1 |
6 | 1 | 1 | 0 |
7 | 1 | 1 | 1 |
- | 4,5,6,7 | 2,3,6,7 | 1,3,5,7 |
根据3只老鼠中毒与否进行组合就能够推断出哪瓶水有毒。
除了老鼠的试喝问题,也有一些可以用到二进制妙用的问题,例如猜数字。
心中默默想一个0-31之间的数字,然后回答下面的问题:
- 你想的数字是否在这里:
1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31- 你想的数字是否在这里:
2,3,6,7,10,11,14,15,18,19,22,23,26,27,30,31- 你想的数字是否在这里:
4,5,6,7,12,13,14,15,20,21,22,23,28,29,30,31- 你想的数字是否在这里:
8,9,10,11,12,13,14,15,24,25,26,27,28,29,30,31- 你想的数字是否在这里:
16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
回答完上述问题,就能够根据答案猜出你所想的数字了。
原理即为上文的二进制技巧。