下面举例一道比较灵活的面试题:
有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
回答完上述问题,就能够根据答案猜出你所想的数字了。
原理即为上文的二进制技巧。
博客通过面试题举例,探讨二进制在算法中的应用。如8瓶水中找1瓶有毒的,用二进制可提高效率,3只小白鼠就能找出。此外,猜0 - 31间数字的问题也可利用二进制技巧,根据回答猜出所想数字。

214

被折叠的 条评论
为什么被折叠?



