這週233醬和多年未見的老友聚了聚,除了變禿了點,大家都還是當初的模樣兒~
我只好把從果殼看來的防禿指南告訴她。雖然沒有一招制勝的卵方法,但也打消了我寫防禿水文的念頭...
###題目描述 有一種玻璃杯從一棟100層的大樓扔下,該種玻璃杯超過某一層樓會摔碎。 現在給你兩個杯子,問確定最低摔碎的樓層需要摔多少次?
###題目分析 這道題的假設是:最低摔碎的樓層可能是每一層樓,且概率相同。我們需要找一種方法,使得定位到[1-100]之間的任意乙個數都是快速的。 ###解題思路 最簡單的方法是用乙個杯子從第一層開始,不斷一層層的往上試。但是這樣的時間複雜度是o(n)。直覺也告訴我們想放大步子扔。
因為我們有兩個杯子,可以考慮成乙個杯子cup1
不斷扔直到破碎,它用來確定最低摔碎的樓層在什麼範圍,
另乙個杯子cup2
再此基礎上一層層的扔。用來準確確定最低摔碎的樓層是多少。
如果憑空想象,我們可能會想到二分法,每次隔5個樓層扔,10個樓層扔...
可是我們馬上也應該會想到這麼分的不妥之處在於:
確定最低摔碎的樓層所需次數是不均勻分布的。
我們再來看:每次扔的樓層間隔會帶來什麼影響?
確定最低摔碎的樓層:
總次數 = cup1扔的次數 + cup2扔的次數
樓層間隔越大,cup2需要扔的次數越多。
相同樓層間隔下:最低摔碎的樓層越高,cup1需要扔的次數越多,cup2需要扔的次數可認為相同。
我們的目的其實是需要盡可能保證:不管最低摔碎的樓層是第一層還是第99層,扔的總次數都盡可能一致且減少。
如果小夥伴有看我上篇文章中lsmt分層步隆過濾器的實現,有沒有受到啟發?
這裡我們可以使cup1需要扔的樓層間隔遞減,這樣可改善高樓層所需cup1/cup2扔的次數。
假設第一次扔的樓層間隔為x,此後依次遞減1層,直到樓層間隔為2.則:x+(x-1)+(x-2)+...+2 >=100
求解出答案為14。
轉一道有意思的面試題
我的老同學開創了乙個軟體公司,富的流油。今天他到這個城市來後馬上打 給我 還好吧?我到這裡的大學招畢業生,要呆上五天,咱哥們趁這個機會好好聚一聚,我做東。既然他要做東,我理所當然順水推舟。來到他下榻的賓館,看見乙個大學生模樣的人站在他面前接受面試。我的老同學說 我這裡有個魔方,你能不能把它弄成六面六...
一道有意思的JS面試題
var name the window var object console.log object.getnamefunc 這道題答案就是 the window 我也毫不猶豫的掉進坑裡面了 苦悶啊 其實這種情況有些人會經常遇到就是會用 var this this 我相信這行 你一定寫過 先說一下函式...
一道有意思的面試題的解答
題目 有一副牌,52張,先要求隨機的進行分配。分析 一52張的副牌,可以分析出實體bean為card 紙牌 還有乙個管理紙牌的類cardmanager。程式如下 card類 cardmanager類 mainclass類 其中的乙個輸出的結果為 程式之中所要注意的問題 personmap.get i...