日前在網上看到一道
面試題。頗有意思,也細細的研究一番。現將該題發布於此,和各位交流一下。
某幢大樓有100層。你手裡有兩顆一模一樣的玻璃珠。當你拿著玻璃珠在某一層往下扔的時候,一定會有兩個結果,玻璃珠碎了或者沒碎。這幢大樓有個臨界樓層。低於它的樓層,往下扔玻璃珠,玻璃珠不會碎,等於或高於它的樓層,扔下玻璃珠,玻璃珠一定會碎。玻璃珠碎了就不能再扔。現在讓你設計一種方式,使得在該方式下,最壞的情況扔的次數比其他任何方式最壞的次數都少。也就是設計一種最有效的方式。
例如:有這樣一種方式,第一次選擇在60層扔,若碎了,說明臨界點在60層及以下樓層,這時只有一顆珠子,剩下的只能是從第一層,一層一層往上實驗,最壞的情況,要實驗59次,加上之前的第一次,一共60次。若沒碎,則只要從61層往上試即可,最多只要試40次,加上之前一共需41次。兩種情況取最多的那種。故這種方式最壞的情況要試60次。
那該如何設計方式呢?
仔細分析一下,關鍵是第一次的選擇,假設在第n層,如果第一次扔的時候就碎了,那麼第二顆珠子只能是從第1層開始一層層往上試,此時,最壞的情況為n-1次,加上第一次,則一共為n層。那如果不碎呢,第二顆珠子會從n+1層開始試嗎?很顯然不會,此時大樓還剩100-n層,問題就轉化為100-n,2顆珠子,請設計最有效方式。
哦,等等想到什麼?呵呵,我想到遞迴
定義乙個函式f(n),表示n層樓最有效方式最壞情況的次數。
通過上面的分析,有
f(n)=min(max(1,1+f(n-1)),max(2,1+f(n-2)),……,max(n-1,1+f(1)))
f(1)=1
本面試題就是求f(100)
下面把解法的**賦予其後,用的是vb2005
1dimf(
100)
asinteger
, i
asinteger
, j
asinteger
2dim
tc as
integer3f(
0) =0
4f(1)
=156
fori =2
to100
7f(i)
=100
8forj =
i to
1step -1
9tc
=iif(j
>1+
f(i
-j), i, 1+
f(i
-j))
10if
tc <
f(i)
then
f(i) =tc
11next
12next
1314
fori =1
to100
1516
debug.print(f(i))
17next
一道有趣的面試題
下面是一道很經典的智力型面試題,也是我一朋友在bat面試中親身見識過的一道題。各位來體驗一下,看看自己的大腦是不是好使。有一棟樓共100層,乙個雞蛋從第n層及以上的樓層落下來會摔破,在第n層以下的樓層落下不會摔破。給你2個雞蛋,設計方案找出n,並且保證在最壞情況下,最小化雞蛋下落的次數。假設每次摔落...
一道有趣的面試題
今天去智聯招聘面試他們資料分析師的時候,部門boss給我出了三道題,前兩道暫且不提,第三道很有意思,作文以記之。題目3 到的每層電梯門口都放著一顆鑽石,鑽石大小不一 各不相同 你乘坐電梯從到,每層樓電梯門都會開啟一次,只能拿一次鑽石且沒有掉頭向下的機會,問怎樣才能拿到 最大 的一顆?讀完題目我第一反...
一道面試題
一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...