自己遇到的一些面試題總結(2)

###############################

Q:找出第k大的數字所在的位置

 

A:

先找到第k大的數字,然後再遍歷一遍數組找到它的位置。所以題目的難點在於如何最高效的找到第k大的數。

我們可以通過快速排序,堆排序等高效的排序算法對數組進行排序,然後找到第k大的數字。這樣總體複雜度爲O(N logN)。

我們還可以通過二分的思想,找到第k大的數字,而不必對整個數組排序。
從數組中隨機選一個數t,通過讓這個數和其它數比較,我們可以將整個數組分成了兩部分並且滿足,{x, xx, ..., t} < {y, yy, ...}。
在將數組分成兩個數組的過程中,我們還可以記錄每個子數組的大小。這樣我們就可以確定第k大的數字在哪個子數組中。
然後我們繼續對包含第k大數字的子數組進行同樣的劃分,直到找到第k大的數字爲止。
平均來說,由於每次劃分都會使子數組縮小到原來1/2,所以整個過程的複雜度爲O(N)。
###############################
Q:找到滿足條件的數組
給定函數d(n) = n + n的各位之和,n爲正整數,如 d(78) = 78+7+8=93。 這樣這個函數可以看成一個生成器,如93可以看成由78生成。
定義數A:數A找不到一個數B可以由d(B)=A,即A不能由其他數生成。現在要寫程序,找出1至10000裏的所有符合數A定義的數。
A:
申請一個長度爲10000的bool數組,每個元素代表對應的值是否可以有其它數生成。開始時將數組中的值都初始化爲false。
由於大於10000的數的生成數必定大於10000,所以我們只需遍歷1到10000中的數,計算生成數,並將bool數組中對應的值設置爲true,表示這個數可以有其它數生成。
最後bool數組中值爲false的位置對應的整數就是不能由其它數生成的。
###############################
Q:統計論壇在線人數分佈
求一個論壇的在線人數,假設有一個論壇,其註冊ID有兩億個,每個ID從登陸到退出會向一個日誌文件中記下登陸時間和退出時間,要求寫一個算法統計一天中論壇的用戶在線分佈,取樣粒度爲秒。
A:
一天總共有 3600*24 = 86400秒。
定義一個長度爲86400的整數數組int delta[86400],每個整數對應這一秒的人數變化值,可能爲正也可能爲負。開始時將數組元素都初始化爲0。
然後依次讀入每個用戶的登錄時間和退出時間,將與登錄時間對應的整數值加1,將與退出時間對應的整數值減1。
這樣處理一遍後數組中存儲了每秒中的人數變化情況。
定義另外一個長度爲86400的整數數組int online_num[86400],每個整數對應這一秒的論壇在線人數。
假設一天開始時論壇在線人數爲0,則第1秒的人數online_num[0] = delta[0]。第n+1秒的人數online_num[n] = online_num[n-1] + delta[n]。
這樣我們就獲得了一天中任意時間的在線人數。
###############################
Q:從10G個數中找到中數
在一個文件中有 10G 個整數,亂序排列,要求找出中位數。內存限制爲 2G。
A:
不妨假設10G個整數是64bit的。

2G內存可以存放256M個64bit整數。
我們可以將64bit的整數空間平均分成256M個取值範圍,用2G的內存對每個取值範圍內出現整數個數進行統計。這樣遍歷一邊10G整數後,我們便知道中數在那個範圍內出現,以及這個範圍內總共出現了多少個整數。
如果中數所在範圍出現的整數比較少,我們就可以對這個範圍內的整數進行排序,找到中數。如果這個範圍內出現的整數比較多,我們還可以採用同樣的方法將此範圍再次分成多個更小的範圍(256M=2^28,所以最多需要3次就可以將此範圍縮小到1,也就找到了中數)。
###############################
Q:編一個程序求質數的和
編一個程序求質數的和,例如F(7) = 2+3+5+7+11+13+17=58。
A:
方法1:
對於從2開始的遞增整數n進行如下操作:
用 [2,n-1] 中的數依次去除n,如果餘數爲0,則說明n不是質數;如果所有餘數都不是0,則說明n是質數,對其進行加和。

空間複雜度爲O(1),時間複雜度爲O(n^2),其中n爲需要找到的最大質數值(例子對應的值爲17)。
方法2:
可以維護一個質數序列,這樣當需要判斷一個數是否是質數時,只需判斷是否能被比自己小的質數整除即可。

對於從2開始的遞增整數n進行如下操作:
用 [2,n-1] 中的質數(2,3,5,7,開始時此序列爲空)依次去除n,如果餘數爲0,則說明n不是質數;如果所有餘數都不是0,則說明n是質數,將此質數加入質數序列,並對其進行加和。

空間複雜度爲O(m),時間複雜度爲O(mn),其中m爲質數的個數(例子對應的值爲7),n爲需要找到的最大質數值(例子對應的值爲17)。
方法3:
也可以不用除法,而用加法。
申請一個足夠大的空間,每個bit對應一個整數,開始將所有的bit都初始化爲0。
對於已知的質數(開始時只有2),將此質數所有的倍數對應的bit都改爲1,那麼最小的值爲0的bit對應的數就是一個質數。對新獲得的質數的倍數也進行標註。
對這樣獲得的質數序列累加就可以獲得質數和。

空間複雜度爲O(n),時間負責度爲O(n),其中n爲需要找到的最大質數值(例子對應的值爲17)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章