2013年阿里巴巴暑期實習生筆試題--2013年5月5日考試

參考:http://blog.csdn.net/doc_sgl/article/details/8888904linux

--------------------------------------------------------------------------------------------------------------c++

答題說明:算法

1.答題時間90分鐘,請注意把握時間;編程

2.試題分爲四個部分:單項選擇題(10題,20分)、不定向選擇題(4題,20分)、填空問答(5題,40分)、綜合體(1題,20分);小程序

 

--------------------------------------------------------------------------------------------------------------數組

1、單項選擇題併發

1.下列說法錯誤的是:函數

A.SATA硬盤的速度大約爲500Mbps/sspa

B.讀取18XDVD光盤數據的速度爲1Gbps操作系統

C.千兆以太網的數據讀取速度爲1Gpbs

D.讀取DDR3內存數據的速度爲100Gbps

分析:A和B相比,怎麼光盤的速度比硬盤還快?B必錯無疑啊。千兆以太網的速度是1000Mbps,也能夠寫成1Gbps。DDR3-1600的極限傳輸速度是12.8GBp/s

2.()不能用於Linux中的進程通訊

A.共享內存

B.命名管道

C.信號量

D.臨界區

分析:Linux中的進程通訊方式有:管道,消息隊列,共享內存,套接字Socket

3.設在內存中有P1,P2,P3三道程序,並按照P1,P2,P3的優先級次序運行,其中內部計算和IO操做時間由下表給出(CPU計算和IO資源都只能同時由一個程序佔用):

P1:計算60ms---》IO 80ms---》計算20ms

P2:計算120ms---》IO 40ms---》計算40ms

P3:計算40ms---》IO 80ms---》計算40ms

完成三道程序比單道運行節省的時間是()

A.80ms

B.120ms

C.160ms

D.200ms

【轉】http://flyown34317.blog.163.com/blog/static/197073016201391031127392/

這道題考察操做系統中有關進程調度,做業調度的有關內容。作題時,畫圖解比較清晰易懂。因爲每一個進程都有三個階段:計算、IO、計算,咱們將這三次計算命名爲ABC。同時須要注意,題目中沒有明說,咱們假設P1P2P3是不可搶佔的。

60ms     80ms    40ms       20ms   20ms     20ms       40ms     40ms     40ms

P1(A)--> P1(B)            --> P1(C) 

              P2(A)   P2(A) --> P2(B)   P2(B)              --> P2(C)          

                                                  P3(A)      P3(A) --> P3(B)    P3(B) --> P3(C)

最終耗時:60+80+40+20+20+20+40+40+40=360ms

全串行執行耗時:160+200+160=520ms

節約了520ms-360ms=160ms

 

4.兩個等價線程併發的執行下列程序,a爲全局變量,初始爲0,假設printf、++、--操做都是原子性的,則輸出不多是()


void foo() {  

  1.     if(a <= 0) {  
  2.         a++;  
  3.     }  
  4.     else{  
  5.         a--;  
  6.     }  
  7.     printf("%d", a);  
  8. }  

 

A.01

B.10

C.12

D.22

舉一個例子

 

【轉】http://flyown34317.blog.163.com/blog/static/197073016201391031127392/

當時我寫的答案是D,而網上其餘版本,好多都講的是C。後來本身思考了一下,以爲A多是正確的,下面將一下個人思路。

對於B答案,P1執行程序,輸出1P2執行程序,輸出0

對於C答案,初始爲0P1執行完判斷語句,決定要執行a++,中斷,P2進行判斷,此時a仍然等於0,執行判斷語句,並執行輸出,獲得1P1而後繼續執行,此時它該執行a++,這時a=1,執行並輸出,結果爲2

對於D答案,初始爲0P1執行完判斷語句,決定要執行a++,中斷,P2進行判斷,此時a仍然等於0,執行a++,獲得a=1,中斷,P1繼續執行a++a=2P1輸出,獲得2P1結束,P2繼續執行輸出語句,獲得2

對於A答案,我如今再三思考,絞盡腦汁也想不起來當初爲何會判斷它不是答案。o(╯□╰)o

 

5.給定fun函數以下,那麼fun(10)的輸出結果是()

 

[cpp]  view plain copy print ?
 
  1. int fun(intx)  
  2. {  
  3.     return(x==1)? 1 : (x + fun(x-1));  
  4. }  

 

A.0

B.10

C.55

D.3628800

 

 

 

6.在c++程序中,若是一個整型變量頻繁使用,最好將他定義爲()

A.auto

B.extern

C.static

D.register

7.長爲n的字符串中匹配長度爲m的子串的複雜度爲()

A.O(N)

B.O(M+N)

C.O(N+logM)

D.O(M+logN)

KMP複雜度是M+N

8.判斷一包含n個整數a[]中是否存在i、j、k知足a[i] + a[j] = a[k]的時間複雜度最小值是()

A.O(n^2)        B. O(n^2*logn)       C. O(n^3)    D. O(nlogn)

 解析:O(N2)用hash的話,三維遍歷能夠輕鬆編程二維遍歷,可是總感受是否是應該有nlgn的算法。

 

 

9.下列序排算法中最壞狀況下的時間複雜度不是n(n-1)/2的是

A.快速排序     B.冒泡排   C.直接插入排   D.堆排序

10.發射三次炮彈,射中目標的機率是0.95,請問發射一次能擊中目標的機率是多少?

A0.63

B0.50

C.0.32

D.0.86

 

0.95 = 1-(1-x)^3;把abcd四個選項代入

2、不定向選擇題

1.如下哪些進程狀態轉換是正確的() 

A.就緒到運行    B.運行到就緒    C.運行到阻塞    D.阻塞到運行    E.阻塞到就緒

這題考察linux系統的進程調度問題,ABCE都是能夠的。D中,阻塞到運行,中間須要經歷就緒狀態。

進程的狀態轉換 - 青山 - 張青山 廊坊師範學院九期信息技術提升班

圖片來源:http://ibicdi.blog.163.com/blog/static/19449410820124276286388/

 

2.一個棧的入棧數列爲:一、二、三、四、五、6;下列哪一個是可能的出棧順序。

這種題是常考的,要熟悉stack的後進先出規則。

3.下列哪些代碼可使得a和b交換數值。(選項不記得)

用兩個數代入看每個選項的代碼可否交換其數值,選出答案。若是不放心,可再選一組進行驗證。

 

4.A和B晚上無聊就開始數星星。每次只能數K個(20<=k<=30)A和B輪流數。最後誰把星星數完誰就獲勝,那麼當星星數量爲多少時候A必勝?

1)對於星星總數爲n,能夠選擇某個k20<=k<=30,使得(n-k)mod50==0時,A有必勝的策略,首先,A先取,使剩餘的星星爲50的倍數。而後數星星的順序爲BABA……。Ba個星星,則A就數50-a個,使剩餘星星始終爲50的倍數,最後,必定是A數最後的星星。A必勝。如2825,讀者可自行推導。

2)若n mod 50==0,則A必敗。B所採用的策略同(1)相似,如2500

3)對於星星總數爲n,能夠選擇某個k0<k<20,使得(n-k)mod50==0時,A必勝。A先取20,則此時30<(n-20) mod 50<50Ba個星星,則a50-a個星星。在最後一輪中,剩餘星星的個數在(30,50)區間,B取任意值都不能取完,A最後取,獲勝。如A選項的,2013A先取20個,剩餘1993個,以後每一回合,AB共取50個,最後一輪剩餘43個,B沒法取完,B取後剩餘數量在[13,23]之間,A必定獲勝。(假設星星數量不足20個時,能夠一會兒取完。)

4)對於星星總數爲n,能夠選擇某個k30<k<50,使得(n-k)mod50==0時,A必敗,由於A每取a個,B就取50-a個,最後剩餘的個數在(30,50)之間,A不管怎麼取,都沒法阻止B最後取完。所以A必敗。如B選項中的2888

3、填空問答題

1.給你一個整型數組A[N],完成一個小程序代碼(20行以內),使得A[N]逆向,即原數組爲1,2,3,4,逆向以後爲4,3,2,1

  1. void revense(int * a,int n) {  
  2.     int begin = 0, end = n-1;  
  3.     int tmp;  
  4.     while(begin < end)  
  5.     {  
  6.         tmp = a[begin];  
  7.         a[begin] = a[end];  
  8.         a[end] = tmp;  
  9.         ++begin;  
  10.         --end;  
  11.     }  
  12. }  

 

2.自選調度方面的問題,題目很長,就是給你三個線程,分別採用先來先分配的策略和最短執行之間的調度策略,而後計算每一個線程從提交到執行完成的時間。題目實在太長,還有幾個表格。考察的是操做系統裏面做業調度算法先進先出和最短做業優先。

3.有個苦逼的上班族,他天天忘記定鬧鐘的機率爲0.2,上班堵車的機率爲0.5,若是他既沒定鬧鐘上班又堵車那他遲到的機率爲1.0,若是他定了鬧鐘可是上班堵車那他遲到的機率爲0.8,若是他沒定鬧鐘可是上班不堵車他遲到的機率爲0.9,若是他既定了鬧鐘上班又不堵車那他遲到的機率爲0.0,那麼求出他在60天裏上班遲到的指望。

遲到的天數=(0.2*0.5*1+0.8*0.5*0.8+0.2*0.5*0.9)*60=30.6

答案:30.6天

4.戰報交流:戰場上不一樣的位置有N個戰士(n>4),每一個戰士知道當前的一些戰況,如今須要這n個戰士經過通話交流,互相傳達本身知道的戰況信息,每次通話,可讓通話的雙方知道對方的全部情報,設計算法,使用最少的通話次數,是的戰場上的n個士兵知道全部的戰況信息,不須要寫程序代碼,得出最少的通話次數。

網上好像說是O(2n-4)

我只能想到O(2n-3) 1和全部人通話,彙總情報,再通告給全部人,其中有一個特例就是最後一我的只須要通知一次,由於到他那裏狀況已經統計完了。因此是2n-3

 

 

5.有N我的,其中一個明星和n-1個羣衆,羣衆都認識明星,明星不認識任何羣衆,羣衆和羣衆之間的認識關係不知道,如今若是你是機器人R2T2,你每次問一我的是否定識另一我的的代價爲O(1),試設計一種算法找出明星,並給出時間複雜度(沒有複雜度不得分)。

答案:
遍歷 1~n 這n我的;
首先取出 1號 和 2號,
若是 1 認識 2, 那麼把 1 去掉;
若是1不認識2,就能夠把2去掉了。
每次比較都去掉一個,如此循環;n-1次以後只有一我的了
時間複雜度: O(n-1)

 

4、綜合題

 

有一個淘寶商戶,在某城市有n個倉庫,每一個倉庫的儲貨量不一樣,如今要經過貨物運輸,將每次倉庫的儲貨量變成一致的,n個倉庫之間的運輸線路圍城一個圈,即1->2->3->4->...->n->1->...,貨物只能經過鏈接的倉庫運輸,設計最小的運送成本(運貨量*路程)達到淘寶商戶的要求,並寫出代碼。

解答:這個題目相似的題目有:

 

參考連接:http://blog.csdn.net/LYHVOYAGE/article/details/19838063

相關文章
相關標籤/搜索