1. 程式人生 > >騰訊筆試題目

騰訊筆試題目

blog 位數 比較 判斷數字 是否 一個數 排列 個數字 筆試題目

1. 統計論壇在線人數分布    
求一個論壇的在線人數,假設有一個論壇,其註冊ID有兩億個,每個ID從登陸到退出會向一個日誌文件中記下登陸時間和退出時間,要求寫一個算法統計一天中論壇的用戶在線分布,取樣粒度為秒。   
一天總共有 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]。 這樣我們就獲得了一天中任意時間的在線人數。
2. 從10G個數中找到中數 在一個文件中有 10G 個整數,亂序排列,要求找出中位數。內存限制為 2G。    
不妨假設10G個整數是64bit的。   
2G內存可以存放256M個64bit整數。 
 
  我們可以將64bit的整數空間平均分成256M個取值範圍,用2G的內存對每個取值範圍內出現整數個數進行統計。這樣遍歷一邊10G整數後,我們便知道中數在那個範圍內出現,以及這個範圍內總共出現了多少個整數。   
如果中數所在範圍出現的整數比較少,我們就可以對這個範圍內的整數進行排序,找到中數。如果這個範圍內出現的整數比較多,我們還可以采用同樣的方法將此範圍再次分成多個更小的範圍(256M
=2^28,所以最多需要3次就可以將此範圍縮小到1,也就找到了中數)
3.  判斷數字是否出現在40億個數中?    給40億個不重復的unsigned int的整數,沒排過序的,然後再給幾個數,如何快速判斷這幾個數是否在那40億個數當中? 
unsigned int 的取值範圍是0到2^32-1。我們可以申請連續的2^32/8=512M的內存,用每一個bit對應一個unsigned int數字。首先將512M內存都初始化為0,然後每處理一個數字就將其對應的bit設置為1。當需要查詢時,直接找到對應bit,看其值是0還是1即可。

騰訊筆試題目