騰訊筆試題:猜字遊戲---猜1-100之間一個數字,最少多少次?第一次猜的數是幾?
先說答案:猜測序列為14, 27, 39, 50, 60,69, 77, 84, 90, 95, 99,哪一次偏大了,就在該數與上一個數的區間一個個猜,最多13次一定能猜到。
如何得到上面這個答案呢?其實這道題跟google那道100層樓丟玻璃球問題是一模一樣的,只不過換了一種說法而已。下面講講解題思路。
剛一看到這道題,熟悉二分查詢的同學肯定馬上想到要用二分查詢來猜,第一個猜50,第二個猜25或者75……可是這樣有一個問題,傳統的二分查詢是需要每次都知道是偏大還是偏小的,但這裡一旦偏大,就再也得不到這個資訊了。這就導致了在這裡如果繼續使用這種類似二分查詢的方法最壞情況下猜測次數分佈不均勻。比如,如果猜50,偏大了,那隻能把50以內的挨個猜一遍,需要50次;但如果偏小了,那再猜75,若偏大,此時只需要在(50,75)之間挨個猜一遍,共1+1+24=26次;顯然,偏大的情況越晚出現,需要的總次數越少。這就是最壞情況總猜測次數分佈不均勻的體現。
直覺告訴我們,要使得總猜測次數最少,那就讓最壞情況的猜測次數分佈均勻即可。假設最多猜測k次,那麼第一個猜的數字應該是k+1,因為若偏大了,則逐一把k, k-1, ……2的共k-1個數猜一遍,最壞的情況是都沒猜中,則1必定是正確結果;若偏小了,則繼續按照下面講的方式猜。
若偏小了,則第二個猜的數字x應該是什麼呢?這就要使得若第二次猜偏大了的話,必定能把總共的猜測次數也控制在k次,因此第二個猜的數x跟第一個猜的數k-1之間要間隔k-1個數,因為這樣的話,即使第二個數偏大了,則逐一把x-1,x-2,……k+2的共k-2個數猜一遍,必定能得到答案。因此第二個猜的數字x為2k。
依此類推,要把100覆蓋,則可以列出不等式:(k+1) + k + (K-1) + …… + 2 + 1 >= 100,解得k >= 13(取整之後)。
下面還有一道類同的雞蛋題:
- 假設你有2個雞蛋,你現在想知道這些雞蛋的硬度。
- 你家住在120層高的大樓裡,現在要在這座大樓上測試雞蛋的硬度。
- 每個雞蛋的硬度相同,雞蛋的硬度定義為:如果雞蛋從第m層上掉
- 下來沒有破裂,而從第m+1層上掉下來就破裂了,那麼這個雞蛋的
- 硬度就是m。某個雞蛋如果在實驗中破裂了就永遠的損失了。要求
- 提供一種方案,在最壞情況下做最少需要最少次數的實驗即可把雞
- 蛋的硬度檢驗出來?