阿里巴巴集團2013實習生招聘技術類筆試題(B)linux
1、單向選擇題程序員
一、在經常使用的網絡協議中,___B__是面向鏈接的、有重傳功能的協議。算法
A. IP B. TCP C. UDP D. DXP網絡
二、500張骨牌整齊地排成一行,按順序編號爲1、2、3、......、499、500,第一次拿走全部奇數位置上的骨牌,第二次再從剩餘骨牌中拿走全部奇數位置上的骨牌,依次類推,請問最後剩下的一張骨牌的編號爲__B__。數據結構
A. 128 B. 250 C. 256 D. 500多線程
解析:併發
第一次後剩下250個偶數:2,4,6,8......498,500iphone
將它們除以2獲得1-250的一列分佈式
第二次後剩下125個偶數:2,4,6,8......248,250網站
將它們除以2獲得1-125的一列
第三次後剩下62個偶數2,4,6,8.......122,124
將它們除以2獲得1-62的一列
第四次後剩下31個偶數2,4,6,8......60,62
將它們除以2獲得1-31的一列
同理,第五次後到15 第六次除後到7 第七次除後到3 第八次除後最後一張
因此,它的編號爲1*2^8=256
三、兩個線程併發執行如下代碼,假設a是全局變量,初始值爲1,那麼如下輸出中__D__是不可能的。
1 void foo() 2 3 { 4 5 ++a; 6 7 printf(「%d_」,a); 8 9 }
A. 3_2_ B. 2_3_ C. 3_3_ D. 2_2_
解析:
對於A選項:線程1先執行++a,此時a=2,
對於B選項:線程1先執行++a,此時a=2,而後線程1輸出;線程2執行++a,此時a=3,最後線程2輸出;
對於C選項:線程1先執行++a,此時a=2,而後中斷,線程2執行++a,此時a=3,線程2輸出,最後線程1輸出;
對於D選項:這個是不可能的。
四、某系統採用36進制數字來表示一個字符串,36個字符0-9,a-z分別由數字0-35表示,則10進制數字872581表示字符串___B___。
A. imc B. ipad C. iphone D. ipod
解析:(872581)10=(18 25 10 13)36,因此爲ipad
五、如下代碼輸出的結果是:___B___
A. 81 B. 27 C. 9 D. 3
六、關於數據結構的如下說法,錯誤的是___C___。
A. 紅黑樹插入操做的平均時間複雜度爲O(logn),最壞時間複雜度爲O(logn)
B. B+樹插入操做的平均時間複雜度爲O(logn),最壞時間複雜度爲O(logn)
C. Hash表插入操做的平均時間複雜度爲O(logn),最壞時間複雜度爲O(n)
D. 排序鏈表插入操做的平均時間複雜度爲O(n),最壞時間複雜度爲O(n)
解析:
Hash表的查找、插入和刪除都是O(1)。
七、哈夫曼編碼是一種無損二進制熵編碼算法,其加權路徑長度最小,字符串「alibaba」的二進制哈夫曼編碼有___C__位(bit)。
A. 11 B. 12 C. 13 D. 14
解析:
a的個數爲3,b的個數爲2,l的個數爲1,i的個數爲1。
最後構造的哈夫曼樹,編碼以下所示。
編碼: 個數
a:1 3
b:01 2
l:000 1
i:001 1
因此,哈夫曼編碼長度爲:3*1 + 2*2 + 3*1 + 3*1 = 13。
八、節點按中序遍歷爲xyz的二叉樹可能有__D__種。
A. 2 B. 3 C. 4 D. 5
解析:
注意左右子樹的問題就OK了。
九、在4個元素的集合上可定義的互不相同的劃分有___B___種。
A. 14 B. 15 C. 16 D. 17
解析:
集合A的一個劃分肯定A的元素間的一個等價關係。
若是劃分爲4個子集,只有一種劃分;
若是劃分爲3個子集,那麼三個子集的元素必須是1、1、2個。有C(4,2)=6種劃分;
若是劃分爲2個子集,那麼多是1+3,也多是2+2.在1+3的狀況,有四種方法去選擇集合的元素,全部有4種。若是是2+2,有C(4,2)=3種。因此,總共有7種兩個子集的劃分;
若是劃分爲1個子集,只有一種劃分;
因此,總共有1+6+7+1 = 15種劃分。
十、如下關於C語言中指針的說法錯誤的是:___C__。
A. 指針的值是一個地址
B. 非法指針是指該指針的值不是一個已經分配內存的地址
C. 兩個指向同類型地址的指針之間作減法是沒有意義的
D. 指針的指針佔用的內存空間和其餘指針佔用的內存空間相同
2、不定向選擇題
1三、如下關於內存泄露的說法正確的是_____。《此題不肯定》
A. 內存泄露是操做系統內存管理出錯致使的問題
B. 單線程程序不可能內存泄露
C. 若是一個進程在運行過程當中佔用的內存無限制的上升,那麼該進程有內存泄露
D. 只有進程在退出以前釋放了全部分配的內存,那麼就不會有內存泄露
E. 內存泄露僅僅出如今C/C++程序的問題,Java程序不會出現內存泄露
解析:
對於A選項,內存泄露一般是指分配出去的內存使用完畢後沒有釋放掉,未被回收,因此,A應該不對。
對於B選項,確定是不對的,單線程也會出現內存泄露;
對於E選項,確定是不對的,Java程序也會出現內存泄露的問題;
1四、關於進程和線程,下面說法正確的是__BCD__
A. 線程是資源分配和擁有的單位
B. 線程和進程均可以併發執行
C. 在linux系統中,線程是處理器調度的基本單位
D. 線程的粒度小於進程,一般多線程比多進程併發性更高
E. 不一樣的線程共享相同的棧空間
解析:
對於A選項,進程是系統資源分配和調度的基本單位;而線程是處理器調度的基本單位;
對於E選項,應該是屬於同一進程的不一樣線程共享相同的棧空間;
第三部分 填空與問題
1六、某種物理機一年的無端障機率爲p,每臺物理機經過虛擬技術能夠虛擬出v臺虛擬機,假定在物理機沒出現故障的狀況下虛擬機不會出現故障,那麼每臺虛擬機一年無端障的機率爲___p___。若是有m臺這樣的物理機,虛擬出mv臺虛擬機,經過某種分佈式容錯技術,可使基於這些虛擬機搭建的服務只要有一臺虛擬機無端障,這個服務即可以無端障。那麼這個服務一年的無端障機率爲__1-(1-p)^m_。若是想經過一樣數量的虛擬機實現更高的無端障機率,但不限制物理機的數量,能夠採用的方法是_下降每臺物理機虛擬出的虛擬機的數量_。
解析:
1七、宿舍內5個同窗一塊兒玩對戰遊戲,每場比賽有一些人做爲紅方,另外一些人做爲藍方,請問至少有多少場比賽,才能使任意兩我的之間有一場紅方對藍方和一場藍方對紅方的比賽?請寫出思路及結果。
解析:
4場。
1八、讀取並處理一個文件中的記錄,每條記錄處理會產生一個對應的結果,不一樣記錄的處理過程之間互不依賴,結果輸出到另外一個文件中,某程序員實現了該處理程序的單線程版本,運行時發現CPU使用率達到80%。
(1)爲什麼CPU使用率不是100%?
(2)假定程序運行的機器的核數在4到16不等,如何設計程序,使該處理程序運行的最快?
(3)在一個n核機器上,速度最快是原來的程序的多少倍?
解析:
(1)CPU使用率達不到100%,有多是CPU分配給該進程的時間片用完,其餘進程搶佔了CPU,從而致使該程序阻塞;
(2)假設該機器的核數爲n,其中4<=n<=16,以及文件中有m條記錄,那麼能夠建立n個線程,每一個線程併發 最多 處理不一樣的m/n+1條記錄,這樣會使該處理程序運行的最快;
(3)最多爲n倍。
1九、請實現一個程序,能對點分字符串按段翻轉。如」www.taobao.com」翻轉爲」com.taobao.www」,」sports.sina.com.cn」翻轉爲」cn.com.sina.sports」。要求時間複雜度爲O(n),空間複雜度爲O(1),結果保存在參數指針所指的空間中。
解析:
解決方法是這樣的,分爲兩步:
(1)首先將整個字符串逐個反轉,例如www.taobao.com 處理後就是 moc.oaboat.www;
(2)再在段內進行一次反轉,結果就是com.taobao.www了;
1 void Swap(char *a, char *b) 2 { 3 char tmp = *a; 4 *a = *b; 5 *b = tmp; 6 } 7 void reverse(char *str, int first, int last) 8 { 9 if(str == NULL || first > last){ 10 return; 11 } 12 int i = first, j = last; 13 while(i < j){ 14 Swap(&str[i], &str[j]); 15 i++; 16 j--; 17 } 18 } 19 char* RerveAll(char *str) 20 { 21 if(str == NULL){ 22 return NULL; 23 } 24 //反轉整個字符串 25 reverse(str, 0, strlen(str) - 1); 26 //段內逐步反轉 27 size_t i = 0; 28 int istart = 0; 29 for(i = 0; i < strlen(str); i++){ 30 if(str[i] == '.') 31 { 32 reverse(str, istart, i - 1); 33 istart = i + 1; 34 } 35 } 36 //最後一個'.'後面的字符串 37 reverse(str, istart, i - 1); 38 return str; 39 }
第四部分 綜合題
某B2C網站有1億用戶和200萬商品,每個用戶都有本身喜歡的若干件商品,若是兩個用戶都喜歡同一件商品,咱們定義中兩個用戶有一個「同好商品」,「同好度」爲兩個用戶的同好商品數和這兩個用戶中至少有一人喜歡的商品數的比值。同好度衡量了兩個用戶之間的商品喜愛的接近程序,這有着十分重要的用途。
請設計一個算法,計算每個用戶的同好用戶集合及同好度。
輸入數據:多個文件,每一個文件的數據有多行,每一行的數據格式以下:用戶ID喜歡的商品ID1 喜歡的商品ID2 .......喜歡的商品n,其中用戶ID和商品ID均爲32位整數,中間以空格分隔。
如:
16 1001 1002 3003
輸出數據:一個或多個文件,每一行的數據格式以下:
用戶ID 同好用戶ID1:同好度 同好用戶ID2:同好度......同好用戶IDn:同好度
中間以空格隔開。算法能夠描述爲僞代碼。