對一道微軟面試題的思考

2021-05-27 05:12:33 字數 1104 閱讀 1635

有100萬個數字(1到9),其中只有1個數字重複2次,如何快速找出該數字。大家討論的很激烈,也給出了很多的演算法。

lthyxy同學的演算法是:掃瞄一遍做計數,然後看那個數的計數器是2。程式如下:

int num[10] = ;

for(int i = 0; i<1000000;++i) //a[i]就是你那些數

num[a[i]]++;

for(int i = 1; i <= 9; ++i)

if(num[i] == 2)

cout << i << endl;

jernymy同學的演算法複雜一些:定義9個陣列,記錄1-9的出現的數字做標記,出現一次則,對應陣列加1, 超過2次,在下次迴圈直接結束,這樣一共直到記錄8個數字後,直接列印第9個數字,就是一共只會出現2次的數字了。程式請看他的部落格:

經過一番分析,我發現jernymy同學的演算法是正確的。因為100萬相對於1到9來說,是個非常巨大的數字。從概率的角度來分析,很有可能在掃瞄到1000個數的時候,就會發現有8個數字的重複次數都超過2,因此剩下的那個數字就是需要查詢的那個數。具體概率分析如下:

假定9這個數字只重複2次,而且還不在這前1000個數裡面,那麼剩下的1到8這8個數字,重複的次數有乙個不超過2的概率是:

1. 總的概率是:8的1000次方。

2. 8個數字中有乙個不超過2的概率:

1)該數字沒有出現:7的1000次方

2)該數字出現一次:1000×7的999次方,約等於1000×7的1000次方

3)該數字出現兩次:1000×999×7的998次方,約等於1000×999×7的1000次方

合計大約等於:1000×1000×7的1000次方

因為有8個數,因此總的數是:8×1000×1000×7的1000次方

3. 計算出來的概率是:(8×1000×1000×7的1000次方)/(8的1000次方)約等於8.15e-52。

可以看出,在掃瞄到1000數的時候,出現8個數字中有乙個數字重複不超過兩次的概率大約為8.15e-52,這個概率也太低了。也就是說,在絕大部分情況下,不用掃瞄1000個數,就可以得出結論了,根本就不需要掃瞄100萬次。這也是我贊同jernymy同學的演算法的主要原因。

關於一道微軟面試題的思考

條件 1.一架飛機加滿油能繞地球飛半圈。2.飛機之間可以互相加油。3.只有乙個機場。問 要多少架飛機起飛才能保證一架飛機繞地球飛一圈?所有飛機都必須安全降落,不考慮加油時間 我想出來的解決辦法 設地球周長為s,三架同時起飛,行到1 8s處,一架返航,這時候它消耗了1 4的油,還需要1 4的油返航,所...

一道微軟面試題

聽說這是一道微軟面試題,今天無意中在網上看到。幾個月前我同學面試時遇到過乙個類似的題目,幾乎是原題。當時在群裡面討論過這個問題,答案不一。也沒有人知道最後的正確答案。下面是原題,帶答案解析。小明和小強都是張老師的學生,張老師的生日是m月n日,2人都知道張老師的生日是下列10組中的一天,張老師把m值告...

一道微軟面試題

每個飛機只有乙個油箱,飛機之間可以相互加油 注意是相互,沒有加油機 一箱油可供一架飛機繞地球飛半圈,問 為使至少一架飛機繞地球一圈回到起飛時的飛機場至少需要出動幾架飛機?所有飛機從同一機場起飛,而且必須安全返回機場,不允許中途降落,中間沒有飛機場 3架飛機共6架次 這道題的關鍵應該是 繞地球飛 假設...