1. 有N臺電腦,其中有大於一半的電腦是好電腦,其他的是壞電腦。用一臺好電腦檢測另一臺電腦,結果肯定是正確的。用一臺壞電腦檢測另一臺電腦,結果則可能是正確的,也可能是錯誤的。請寫出一個策略,找出一臺好電腦。
這個是同事發郵件問的一道題目,挺有意思的,我想了半天,只相出了一個O(n2)的解法,但是隨後有一個Intern給出了一個O(N)就可以找出一臺好電腦的解法,真是強人啊。
具體做法如下:
假設N個電腦順序排列,第一次取最前面的兩臺電腦,使這兩臺電腦互相測試,
(1)如果兩臺電腦的檢測結果都是好的,那麼這兩臺電腦,都保存下來
(2)如果兩臺電腦的檢測結果是一好一壞或者兩個都是壞,那麼這兩個電腦就從隊列中移除
(3)如果執行的是(1),那麼就使用剛纔兩臺中的後一臺電腦和其後相鄰的電腦,重新開始測試,根據結果,重複這一過程。
(4)如果執行的是(2),那麼就使用後續相鄰的兩臺電腦開始新一輪的測試,根據結果重複這一過程。
由於最開始,好電腦的臺數大於一半,因此最後當隊列中只剩下一臺電腦時,該電腦肯定是好電腦。
舉例說明如下,假設有5臺電腦,其中3臺好電腦,2臺壞電腦,假設一個可能的隊列如下:
Good ,Bad,Good,Good,Bad,依次編號爲1,2,3,4,5
那麼,首先1和2互相測試,結果肯定不可能是都好,因此,1和2同時被移出隊列,那麼隊列目前剩下3,4,5。 然後,使用3和4互相測試,因爲都是好電腦,所以結果肯定是兩個好,那麼都保留,然後使用後一個,也就是4號來和後面相鄰的電腦,也就是5號來做下輪的相互測試,因爲5號是壞電腦,那麼4和5的相互測試結果不可能是兩個好,因此,4,5同時被移出隊列。至此,就只剩下3號這一臺電腦,而且3號電腦也是一臺好電腦。
2.一個水桶裝滿可以裝3升水,一個水桶裝滿可以裝5升的水,請問如何用這兩個桶裝出4升的水?
這個題目是我面試的時候碰到的一個簡單的智力題目,要求不可以藉助其他的任何工具。
方法有很多,其中一種如下:
用5升的桶裝滿水,然後把5升的桶中的水倒入3升的桶中,那麼5升的桶中剩下2升水。將3升桶中的水倒掉,然後再將5升桶中剩下的2升水倒入3升的桶中。這是3升的桶中只有2升的水,也就是說剩餘的空間可以再容納1升的水。然後,將5升的水裝滿,往3升的桶中倒水,當3升的桶裝滿的時候,5升桶剩下的水必然是4升。