Java演算法面試題(009) 毒酒問題

劉近光發表於2017-12-20

介紹

1000桶酒,其中1桶有毒。用小老鼠做實驗,一旦吃了有毒的酒,一週後小老鼠毒性就會發作而亡。問如何在最短的時間內用最少的老鼠找到那桶有毒的酒?

思路一

將現有的酒分成兩組,分別將兩組酒混合後餵給兩隻老鼠,1周以後即能分出哪組裡存在毒酒;依次類推的話。

2的10次方為1024,因此進行10次迭代操作,即可找到那桶毒酒。總計使用20只老鼠,10周時間找到毒酒桶。

這個估計大部分程式設計師都能想到的方案,但這個不是最佳的方案。

思路二

給現有的桶按1-1000的編號,最大編號為1000,其二進位制表示11 1110 1000,共10位。我們使用10只老鼠,編號分別為:

第01只  00 0000 0001
第02只  00 0000 0010
第03只  00 0000 0100
第04只  00 0000 1000
第05只  00 0001 0000
第06只  00 0010 0000
第07只  00 0100 0000
第08只  00 1000 0000
第09只  01 0000 0000
第10只  10 0000 0000
然後根據桶編號給相應的老鼠喂酒,如編號為100的酒桶,其二進位制表示為00 0110 0100,其中從左邊數第3、6、7位為1,取這桶中的酒餵給編號為3、6、7的老鼠,依次類推,將所有酒桶取酒餵給相應的老鼠。一週以後,根據死亡老鼠的編號,可以找出的酒桶,舉個例子:比如第1、2、3、4只老鼠死亡了,那麼表示的二進位制數為 00 0000 1111,轉換成10進製為15,因此可以推斷出編號為15的酒桶中的酒有毒。

這確實是一種比較精巧的解法,依據二進位制的表示,快速找到有問題的酒桶。


相關文章