一道面試題的分析

2022-02-25 17:06:55 字數 2292 閱讀 1425

在 萬倉一黍 的部落格中看到了「一道有趣的面試題 」這篇文章,文中給出了一種解法,仔細想了一下,發現也可以在常數時間複雜度下解決。

題目:

某幢大樓有100層。你手裡有兩顆一模一樣的玻璃珠。當你拿著玻璃珠在某一層往下扔的時候,一定會有兩個結果,玻璃珠碎了或者沒碎。這幢大樓有個臨界樓層。低於它的樓層,往下扔玻璃珠,玻璃珠不會碎,等於或高於它的樓層,扔下玻璃珠,玻璃珠一定會碎。玻璃珠碎了就不能再扔。現在讓你設計一種方式,使得在該方式下,最壞的情況扔的次數比其他任何方式最壞的次數都少。也就是設計一種最有效的方式。

例如:有這樣一種方式,第一次選擇在60層扔,若碎了,說明臨界點在60層及以下樓層,這時只有一顆珠子,剩下的只能是從第一層,一層一層往上實驗,最壞的情況,要實驗59次,加上之前的第一次,一共60次。若沒碎,則只要從61層往上試即可,最多只要試40次,加上之前一共需41次。兩種情況取最多的那種。故這種方式最壞的情況要試60次。

解:原題是,已知大樓的高度,求最少的實驗次數。現在為了便於計算,先把題目反過來考慮:

還是上面的實驗,已知進行實驗k次可以得到了臨界樓層,求這個樓的最大高度h。

開始實驗:

第1步:任取乙個樓層h1 (1 =< h1 <= h),用第一顆珠進行實驗,如果珠碎,則用低二顆珠從第一層向上逐層進行實驗,在最壞情況下, 實驗次數為k1=h1 ,即可得到結果。否則,如果第乙個珠碎了,並且 h1!= h 則令 i=2 進行第二步實驗。

第2步:任取乙個樓層hi (hi-1即:

ki = h1                                   (i=1)          (等式 1.1)

ki = (i – 1) + hi - hi-1             (1ki = (n – 1) + h - hn-1             (i=n)          (等式 1.3)

將上面的等式按 i=1,2,3…n 相加可得:

k1 + k2 + k3 + … + kn=1 + 2 + 3 + … + (n-1) + h =n*(n-1)/2 + h

即: h = (k1 + k2 + k3 + … + kn) - n*(n-1)/2  

因為 k = max(k1, k2, k3, … , kn)  是已知的, 所以當k1 = k2 = k3 = …  = kn = k 是 h 取得最大值

所以:

h = n *k - n*(n-1)/2                                    (等式 1.4)

等式1.3 可以寫成 k = (n – 1) + hn - hn-1   可得

hn - hn-1 = k + 1 – n > 0

即 n所以 n的取直範圍是 1=< n <=k

等式1.4 是關於n的二次函式, 當n = k 時 等式1.4取得最大值,最大值是 :

h = k(k+1)/2                                        (等式 1.5)

這就求出了 k 次實驗能確定臨界層的最大樓層高度。

下面在把題目正過來,考慮原題:

由等式1.5 , k-1次實驗能確定臨界層的最大樓層高度為h』=k (k-1) /2

則,如果樓層的高度 x 在區間(h』 , h] 範圍內,則最多進行k次實驗即可的到臨界層 。

即  

k(k-1)/2 < x <= k(k+1)/2                        (不等式 1.6)

將不等式 1.6 各項 × 2 得:

k(k-1) < 2*x <= k(k+1)                       (不等式 1.7)

而      

(k-1)^2  < k(k-1) < k^2 < k(k+1) <(k+1)^2

即,不等式 1.7 所確定的個區間中有且僅有1個完全平方數,則找出與2*x 近似的完全平方數k^2 , 那麼k就是最終的結果。

計算的時候分別算出

k1 = floor( sqrt (2*x)) 

k2 = ceil(sqrt (2*x)) 

分別將 k1, k2 帶入不等式 1.6 ,可得到兩個區間,如果x在第乙個區間中則結果是k1, 否則是k2 .

/*c語言原始碼*************************************/

#include#includeint fun (int x)

int main()

一道面試題的分析

題目 console.log a var a 1 console.log a function a console.log a var a 3 console.log a function a console.log a a 執行結果 分析 題目中有多個變數宣告和函式宣告,都會提公升,而函式的優先順...

一道面試題

一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...

一道面試題

前些時候在找工作,就在準備結束此次找工作歷程的時候,去了一家公司面試,去了之後技術經理直接帶到一台電腦旁,給了一張紙條,上面是這樣的題目 用c或c 來實現 1 建立一棵樹,該樹的深度是隨機的,每個節點的位元組點數是隨機的。2 給每個節點分配一段隨機大小的記憶體空間,給每個節點賦乙個隨機數。3 遍歷這...