騰訊猜字遊戲

2021-09-06 09:29:15 字數 1583 閱讀 6066

link: 

分類: interview

2013-04-24 10:27

31人閱讀收藏 

舉報a、b兩人玩猜字遊戲,遊戲規則如下:

a選定乙個 [1,100]之間的數字背對b寫在紙上,然後讓b開始猜;

如果b猜的偏小,a會提示b這次猜的偏小;

一旦b某次猜的偏大,a就不再提示,此次之後b猜的偏小a也不會再提示,只回答猜對與否。

請問:b至少要猜( )次才能保證猜對?在這種策略下,b第一次猜測的數字是( )。

首先閱讀題目,乙個很重要的資訊點就是: 一旦b某次猜的偏大,a就不再提示,此次之後b猜的偏小a也不會再提示,只回答猜對與否 。如果沒有這個條件,或者說改變這個條件,改為: 如果b猜的偏大,a會提示b這次猜的偏大 那麼相信大家都會給出答案,那就是用二分法,只需要7次就可以保證猜對了。

但是現在的條件變了,如果b猜的偏大,那麼不提示,所以我們得出結論就是:如果猜的偏大,只能乙個乙個往下猜。答案在下面雞這個題目裡面。

標準答案是14次,第乙個數選擇 9-14中任意乙個猜,假設第乙個數猜10,依次為23,35,46…

如何得到上面這個答案呢?其實這道題跟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。某個雞蛋如果在實驗中破裂了就永遠的損失了。要求

提供一種方案,在最壞情況下做最少需要最少次數的實驗即可把雞

蛋的硬度檢驗出來?

JAVA 猜字遊戲

猜字元遊戲 1.設計資料結構 a.char chs 隨機生成的字元陣列 b.char input 使用者輸入的字元陣列 c.int letterright 字元對的個數 d.int positionright 位置對的個數 e.int result 對比的結果 f.int score 得分 g.in...

java迴圈語句猜字遊戲

int m int math.random 1000 1 生成乙個隨機數隨機數為開區間0到1000 所以加1變成 1 m 1001 system.out.println 輸入你給出的數 1 1000 scanner sc new scanner system.in int guest sc.next...

python異常處理 猜字遊戲

異常處理 1 猜數字遊戲 題目描述 電腦產生乙個零到100之間的隨機數字,然後讓使用者來猜,如果使用者猜的數字比這個數字大,提示太大,否則提示太小,當使用者正好猜中電腦會提示,恭喜你猜到了這個數是 在使用者每次猜測之前程式會輸出使用者是第幾次猜測,如果使用者輸入的根本不是乙個數字,程式會告訴使用者 ...