有一種玻璃杯質量確定但未知,需要檢測。
有一棟100層的大樓,該種玻璃杯從某一層樓扔下,剛好會碎。
現給你兩個杯子,問怎樣檢測出這個杯子的質量,即找到在哪一層樓剛好會碎?
題解目錄
方案一:二分法
方案二:分段查詢
方案三:解方程
方案四:動態規劃推廣
看到這道題的時候我自然地想,從一樓開始扔起...這還不簡單?然而之前面試掛掉的經驗讓我知道,這時候面試官一定會問:
1、兩個杯子質量一樣;
2、如果杯子在第n樓扔下去沒有碎,那在小於n樓扔下去也不會碎;
3、如果杯子在第n樓扔下去碎了,那就得往小於n樓繼續檢驗(但杯子只有兩個);
4、如果杯子扔下去沒碎,還能反覆利用。
總的來說就是,通過有限的兩個杯子,快速找到在第n-1樓扔下去不碎而第n樓扔下去會碎的這個樓層n。
這不就是查詢嗎,不過得保證在杯子用完之前能找到這個樓層,作為乙個樸實的演算法菜鳥,我首先就想到了——二分法:
先從50樓扔下去乙個杯子,沒碎的話就往上走,從75樓扔下去,沒碎就繼續,直到找到剛剛好碎掉的樓層。然而事情不會這麼順利,在這種方案下我們只能往上走。一旦第乙個杯子碎了,就得從最低樓層往上找了,比如說:我從50樓扔下去,沒碎,再從75樓扔下去,碎了,這時候只能從51層開始往上嘗試,如果剛好結果是74樓的話,總共得扔1+24=25次。所以最壞的情況也出來了:從50樓扔下去,碎了,然後乖乖從1樓開始往上試,如果剛好結果是49樓的話,總共得扔1+49=50次。
面試官:「還行,次數少了一半了,你再多想想?」
如果二分不行,那就把區間分得比二分再細一些,也就是分段地扔,比如說把100樓分成10段,從10樓開始往上,逐十樓地扔。
這樣最好的情況是:從10樓扔下去剛好碎了,從1樓開始試,假如恰好在9樓碎了,那總共得扔1+9=10次。
最差的情況是:從10樓開始扔,沒碎,繼續走到20樓開始扔,也沒碎,一直到了100樓扔下去碎了,然後從91樓開始往上嘗試,假如恰好在99樓碎了,總共得扔10+9=19次。
面試官:「可以,更快了,但我不想多跑幾次,能不能告訴我最少扔幾次就能確定出樓層?」
這麼說有理論上的最少嘗試次數?其實從前面兩種方案能夠看出我們試錯的規律:假如我只需要扔x次,那必須得從第x樓開始扔,這是因為碎了的話,我還可以嘗試前面的x-1樓,確保能夠找到目標樓層。那根據碎和不碎就有兩種情況:
假如經過x次嘗試能夠到達的最高樓層就是x+(x-1)+(x-2)+ ... +1=x(x+1)/2,如果最高樓層是100,那求解x(x+1)/2>=100,得到x>=14,即按上述方案至多嘗試14次就能確保找到目標樓層,所以最少嘗試次數就是14次。
相信此時面試官已經滿意了,但是我不滿意了。
「萬一下次它問我3個杯子怎麼辦?再多想想?」
當我們只有乙個杯子的時候,其實能做的事情只有從低樓層開始往上嘗試。有了兩個以上的杯子就有了多次試錯的機會,減少嘗試的次數。如果只要找到最優解,那可以通過動態規劃,將n個杯子的問題拆成n-1個杯子的子問題和1個用於試錯的杯子。
將問題標記為w(n,k),其中 n 代表可用於測試的杯子數,k 代表被測試的樓層數。
對於問題 w(2,100), 我們可以如此考慮:
解決上述的兩個子問題後,我們可以取兩者中嘗試次數最多的方案(排除掉因為歐氣快速找到樓層的情況,確保能夠找到目標樓層),與在第 i 樓嘗試的這次相加,即得到了在第 i 層扔下杯子時 w(2,100)這個問題的最少嘗試次數。
而在所有杯子從100樓中任意樓層扔下去,產生的100個測試方案,它們的嘗試次數恆大於等於乙個理論上最少的嘗試次數t,這個t就是本問題的答案。
遞推公式:
w(n, k) = 1 + min, x in
同理,我們可以拓展n個杯子、m個樓層的問題!
我:「我還能想,別攔著我!」
遇到的面試題 「測試杯子」
測試專案 杯子。需求測試 檢視杯子使用說明書,是否有遺漏。介面測試 檢視杯子外觀,是否變形。是否與設計一致。圖案,顏色是否完好無損。功能性 用水杯裝水看漏不漏 水能不能被喝到。安全性 杯子有沒有毒或細菌。可靠性 杯子從不同高度落下的損壞程度。可移植性 杯子在不同的地方 溫度等環境下是否都可以正常使用...
軟體測試面試題之杯子
一 功能測試 1.能否裝水 2.除了裝水,能否裝其他液體。比如可樂,酒精 3.能裝多少 ml的水 4.杯子是否有刻度表 5.杯子能否泡茶,泡咖啡 6.杯子是否能放冰箱,做冰塊 7.杯子的材質是什麼 玻璃,塑料 做的 二 介面測試 1.外觀好不好看 2.什麼顏色 3.杯子的形狀是怎麼樣的 4.杯子的重...
各種面試題 碰撞檢測
來先個矩陣相交的 矩陣相交的條件是 p1,p2 p3,p4 兩個矩形,滿足 pp max p1.x,p3.x max p1.y,p3.y pq min p2.x,p4.x min p2.y,p4.y 那麼相交的條件是 pp.x pq.x pp.y pq.y 即兩個 點能組成一條直線或者矩形。然後是線...