【IT企業筆試集】2013年阿里巴巴實習生招聘筆試題目及解答


有幸參加了2013年5月5日阿里巴巴的實習生招聘筆試,這次筆試的難度對我而言,前半部分不涉及算法的內容,都比較容易。而后面3道關於算法的習題都解答得很不好,暴露出來自己的一些問題。本人馬上也要畢業了,想通過這個博客記錄下自己在准備應聘過程中所遇到的各種問題、難題,記錄下來以供查閱,同時與諸君分享,歡迎積極交流。

 題目來源:http://50vip.com/blog.php?i=223 

 一、單項選擇題

1.下列說法不正確的是:

A.SATA硬盤的速度速度大約為500Mbps/s

B.讀取18XDVD光盤數據的速度為1Gbps

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

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

我自己做題時候的思路是:本人有08年的Y430一台,當時給硬盤測速時,記得是60MB/s,也即480Mbps/s,選項A大差不差;印象中,光盤的速度再快,也只有幾十M/s,硬盤尚不能達到1Gbps,更何況光盤呢?基本上可以確定B是錯誤的;所謂的千兆,即1000M=1G,C是對的;而對於DDR3的內存速度,有次為了創建ramdisk,使用工具對內存進行了鑒別,隱約記得速度是GB/s級別的,D選項中,100Gbps換算過來也就是12.5GB/s,有理由相信它是正確的。綜上,可以判斷出B是錯誤的。

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

A.共享內存

B.命名管道

C.信號量

D.臨界區

所謂的臨界區(critical section),實際上指的是一段代碼。選D;在《Windows核心編程第五版》中,對臨界區的解釋是:它是一小段代碼,它在執行之前需要獨占對一些共享資源的訪問權。這種方式可以讓多行代碼以“原子方式”來對資源進行操控。這里的原子方式,指的是代碼知道除了當前線程之外,沒有其他任何線程會同時訪問該資源。當然,系統仍然可以暫停當前線程去調度其他線程。但是,在當前線程離開臨界區之前,系統是不會去調度任何想要訪問同一資源的其他線程。

至於A、B、C,都是進程通信的手段。

Linux中,進程通信的手段有:待補充。

 

 

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

這道題考察操作系統中有關進程調度,作業調度的有關內容。做題時,畫圖解比較清晰易懂。由於每個進程都有三個階段:計算、IO、計算,我們將這三次計算命名為A、B、C。同時需要注意,題目中沒有明說,我們假設P1、P2、P3是不可搶占的。

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() {
    if(a <= 0) {
        a++;
    }
    else {
        a--;
    }
    printf("%d", a);
}
A.01 B.10 C.12 D.22

當時我寫的答案是D,而網上其他版本,好多都講的是C。后來自己思考了一下,覺得A可能是正確的,下面將一下我的思路。

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

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

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

對於A答案,我現在再三思考,絞盡腦汁也想不起來當初為什么會判斷它不是答案。o(╯□╰)o。

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

int fun(int x) {
    return (x==1) ? 1 : (x + fun(x-1));
}

A.0

B.10

C.55

D.3628800

遞歸展開,f(10)=10+f(9)=10+9+f(8)+……+1=55。

 

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

A.auto

B.extern

C.static

D.register

C語言中提供了存儲四種修飾符:auto,register,extern,static的:

auto修飾符僅在語句塊內部使用,初始化可為任何表達式,其特點是當執行流程進入該語句塊的時候執行初始化操作,沒有默認值。

使用register修飾符修飾變量,將暗示編譯程序相應的變量將被頻繁地使用,如果可能的話,應將其保存在CPU的寄存器中,以加快其存儲速度。

static靜態變量聲明符。在聲明它的程序塊,子程序塊或函數內部有效,值保持,在整個程序期間分配存儲器空間,編譯器默認值0。是C/C++中很常用的修飾符,它被用來控制變量的存儲方式和可見性。static被引入以告知編譯器,將變量存儲在程序的 靜態存儲區而非棧上空間。

extern可以置於變量或者函數前,以表示變量或者函數的定義在別的文件中,提示編譯器遇到此變量和函數時在其他模塊中尋找其定義。另外,extern也可用來進行鏈接指定。

 

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

A.O(n)

B.O(m+n)

C.O(n+logm)

D.O(m+logn)

筆試的時候,KMP算法還復習,現在都已經忘得差不多了,當時答案是蒙的。字符串匹配算法在最近也必須得重新復習。(注:此部分以后再補充)。

 

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

A.O(n)    B.O(n^2)     C.O(nlog(n))    D.O(n^2log(n))

待補充。

 

9.下列排序算法中最壞復雜度不是n(n-1)/2的是
A.快速排序     B.冒泡排序   C.直接插入排序   D.堆排序

顯而易見。排序算法的比較待補充。

 

10.三次射擊能中至少一次的概率是0.95,請問一次射擊能中的概率是多少?
A.0.32 B.0.5 C.0.63 D.0.85

公式很簡單,1-(1-p)^3=0.95。接下來需要有一定的估算技巧。A選項可以看作是1/3,C選項可看作是2/3,D選項可看作4/5。

 二、不定項選擇題

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

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

這題考察linux系統的進程調度問題,A、B、C、E都是可以的。D中,阻塞到運行,中間需要經歷就緒狀態。

進程切換圖,待補充。

2.一個棧的入棧數列為:123456;下列哪個是可能的出棧順序。(選項不記得)

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

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

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

4.A和B晚上無聊就開始數星星。每次只能數K個(20<=k<=30)A和B輪流數。最后誰把星星數完誰就獲勝,那么當星星數量為多少時候A必勝?(選項不記得)
A、2013   B、2888  C、4062 D、***    E、***

(1)對於星星總數為n,可以選擇某個k值20<=k<=30,使得(n-k)mod50==0時,A有必勝的策略,首先,A先取,使剩余的星星為50的倍數。然后數星星的順序為B、A、B、A……。B數a個星星,則A就數50-a個,使剩余星星始終為50的倍數,最后,一定是A數最后的星星。A必勝。如2825,讀者可自行推導。

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

(3)對於星星總數為n,可以選擇某個k值0<k<20,使得(n-k)mod50==0時,A必勝。A先取20,則此時30<(n-20) mod 50<50。B數a個星星,則a數50-a個星星。在最后一輪中,剩余星星的個數在(30,50)區間,B取任意值都不能取完,A最后取,獲勝。如A選項的,2013。A先取20個,剩余1993個,之后每一回合,A、B共取50個,最后一輪剩余43個,B無法取完,B取后剩余數量在[13,23]之間,A一定獲勝。(假設星星數量不足20個時,可以一下子取完。)

(4)對於星星總數為n,可以選擇某個k值30<k<50,使得(n-k)mod50==0時,A必敗,因為A每取a個,B就取50-a個,最后剩余的個數在(30,50)之間,A無論怎么取,都無法阻止B最后取完。因此A必敗。如B選項中的2888。

 

三、填空問答題

1.給你一個整型數組A[N],完成一個小程序代碼(20行之內),使得A[N]逆向,即原數組為1,234,逆向之后為4,321

void revense(int * a,int n) {
  int i;
  for(i=0;i<=(n-1)/2;i++)
  {
      int tmp=a[i];
      a[i]=a[n-1-i];
      a[n-1-i]=tmp;
  }
}

答案:使用一個循環即可,交換i和n-1-i,(i=0,1,2,3...(n-1)/2)

 

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

答案:此部分是操作系統有關進程調度方面的內容,要多復習課本知識!

 

3.有個苦逼的上班族,他每天忘記定鬧鍾的概率為0.2,上班堵車的概率為0.5
如果他既沒定鬧鍾上班又堵車那他遲到的概率為1.0,如果他定了鬧鍾但是上班堵車那他遲到的概率為0.9
如果他沒定鬧鍾但是上班不堵車他遲到的概率為0.8,如果他既定了鬧鍾上班又不堵車那他遲到的概率為0.0
那么求出他在60天里上班遲到的期望。

答案解析:概率論與數理統計的基礎知識,不詳述了。

 

4.戰報交流:戰場上不同的位置有N個戰士(n>4),每個戰士知道當前的一些戰況,現在需要這n個戰士通過通話交流,互相傳達自己知道的戰況信息。
每次通話,可以讓通話的雙方知道對方的所有情報,設計算法,使用最少的通話次數,是的戰場上的n個士兵知道所有的戰況信息,不需要寫程序代碼,得出最少的通話次數。

待補充。

 

5.有N個人,其中一個明星和n-1個群眾,群眾都認識明星,明星不認識任何群眾,群眾和群眾之間的認識關系不知道。
現在如果你是機器人R2T2,你每次問一個人是否認識另外一個人的代價為O(1),試設計一種算法找出明星,並給出時間復雜度(沒有復雜度不得分)。

解答:使用a->b的有向邊表示a認識b。明星不認識任何一名群眾,推出,如果a->b,則a一定不是明星。又由於任何一個群眾都認識明星,則任意找出來兩個人a和b,如果不存在a到b的有向邊,則b一定不是明星;

將n個人編號為1,...,n-1。

(1)取1號,問1號是否認識2號,若1號認識2號,則1號肯定不是明星,2號留;若1號不認識2號,則2號肯定不是明星,1號留,這樣就剔除掉1人;

(2)問(1)中留下的那個人是否認識3號,……

(3)…………

(n-1)…………

依次類推,每一次詢問均能剔除一個人,最后剩余的人一定是明星,復雜度是O(n-1)。

 

四、綜合題

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

待補充。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM