巧妙變換;及可憐的小老鼠分析

紫鳳發表於2013-08-07

今日面試題:巧妙變換

輸入陣列[a1,a2,...,an,b1,b2,...,bn],建構函式,使得輸出為,[a1,b1,a2,b2,...,an,bn],注意:方法要是in-place的。

======================================

可憐的小老鼠分析

原題

有11瓶酒,只有一瓶有毒。喝酒之後,三天會死,只有三天時間。請問至少需要多少隻老鼠,可以找出9瓶沒有毒的酒。

分析

題目描述很簡單,可我們仍要抓住要點:

  • 11瓶,1瓶有毒
  • 喝酒之後,三天會死;只有三天時間->即使某一個老鼠沒有被毒死,也不會有時間重複利用了
  • 要使用最少個數的老鼠,要找到9瓶沒有毒的

10瓶無毒的,為何要找到9瓶呢?老鼠開始喝酒,第一隻要喝哪些,第二隻要喝哪些呢?現在有什麼依據麼?顯然酒瓶和老鼠都是一樣的,不可區分的。那麼怎麼來選擇哪些老鼠喝哪瓶酒,進而進行判斷呢?這是這個題目的關鍵點、核心點。11個酒瓶,我們對其編號1-11,如下為二進位制的表示,看完二進位制的表示,也許很多同學,就明白了該如何選擇。

編號 二進位制
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
10 1010
11 1011

觀察每一位的0和1的分佈情況,從右向左,第一位是1的,有6個情況;是0的,有5個情況。這樣,我們可以讓一隻老鼠喝掉都是1的,然後又兩種情況:

  • 老鼠死了,說明有毒的那個瓶子的二進位制位從右到左第一位是1.
  • 老鼠沒死,說明有毒的那個瓶子的二進位制位從右到左第一位是0.

同樣的,同時,另外兩隻老鼠測試第二位為1的瓶子以及第三位為1的瓶子,分別因為死或者沒死,得到0、1的情況。三隻老鼠,所有可能的情況如下

01情況 解釋
000 三個老鼠都沒死,只可能是1000號瓶子有毒,剩下10個都沒毒
001 可能有毒的是0001、1001,去掉這兩個,還有9個無毒
010 0101有毒,10個無毒
011 0011,1011可能有毒,9個確保無毒
100 0100有毒,10個無毒
101 0101有毒,10個無毒
110 0110有毒,10個無毒
111 0111有毒,10個無毒

根據上面的表格,得到,至少需要三個老鼠。此類的題目分析的思路,就是這樣的,要找到突破口:表示為二進位制的形式。

例如,1w瓶酒,只有一瓶有毒,只有三天時間,老鼠喝了之後,三天才會發作,至少需要多少隻老鼠,才能找到有毒的酒?一樣的思路,就是二進位制位數多了一些。

【分析完畢】

本文來自微信:待字閨中,2013-08-03釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。

相關文章