2013.5.5阿里巴巴實習生筆試題

阿里巴巴2013實習生招聘筆試題php

答題說明:ios

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

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

3.其餘一些亂七八糟的考試說明。小程序


1、單項選擇題數組

1.下列說法不正確的是:(D)網絡

A.SATA硬盤的速度速度大約爲500Mbps/s併發

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

C.前兆以太網的數據讀取速度爲1Gpbsspa

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

解析:

DDR3內存讀取速度約爲1.6Gbps

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

A.共享內存

B.命名管道

C.信號量

D.臨界區

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

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

A.80ms

B.120ms

C.160ms

D.200ms

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

void foo() {

    if(a <= 0) {

        a++;

    }

    else {

        a--;

    }

    printf("%d", a);

}

A.01

B.10

C.12

D.22

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

int fun(int x) {

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

}

A.0

B.10

C.55

D.3628800

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

A.auto

B.extern

C.static

D.register

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

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]的時間複雜度爲(B)

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

9.三次射擊能中一次的機率是0.95,請問一次射擊能中的機率是多少?(A)
A.0.63

B.0.5

C.**

D.0.85

10.下列序排算法中最壞複雜度不是n(n-1)/2的是_(D)

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

2、不定向選擇題

1.不記得

2.一個棧的入棧數列爲:一、二、三、四、五、6;下列哪一個是可能的出棧順序。(選項不記得)

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

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

3、填空問答題

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

void revense(int * a,int n) {

 

}

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

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),試設計一種算法找出明星,並給出時間複雜度(沒有複雜度不得分)。O(n)

假設有個機器人能問問題A是否定識B?時間複雜度爲O(1),那麼設計一個算法用最小的複雜度找出明星。(不寫代碼,不計算複雜度不得分)

遍歷這n我的;

首先取出 1號 和 2號,

若是 1 認識 2, 那麼把 1 去掉;

若是1不認識2,就能夠把2去掉了。

每次比較都去掉一個,如此循環;n-1次以後只有一我的了

時間複雜度: O(n)

解答:這個問題等價於找未知序列數中的最小數,咱們將reg這個函數等價爲如下過程:,若是i認識j,記做i大於等於j,一樣j不必定大於等於i,知足要求,i不認識j記做i<j,對明星k,他不認識全部人,則k是其中最小的數,且知足其他的人都認識他,也就是其他的人都大於等於k.這樣問題就被轉換了。就拿N=5來講,首先有數組S[5]={A,B,C,D,E}這5個變量,裏邊存放着隨機數,求是否存在惟一最小數,若是存在位置在S中的哪裏。(樓主這裏是這個意思,按個人理解題中這個最小數必定是存在且惟一的)

int finds(S,N)

{

    int flag=0;//用於斷定是否有明星,即當前最小數另外出現幾回

    int temp=0;//存放最小數在S中的位置

    for(i=1;i<N;i++)

  

      if(!reg(S[i],S[temp])//若是temp標號的數小於i標號的數

    

         temp=i;

         flag=0;//更換懷疑對象(最小數)時,標記清零

     

      elseif(reg(S[temp],S[i])//若是temp裏存放的確實是惟一最小數是不會跑進這裏來的

      {

           flag++;

`     }

   

    if(flag>0) return -1;//表示沒有明星,例如全部的數都相等

    return temp;//返回明星在S中的位置

}

4、綜合題

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

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

題目:http://www.lydsy.com/JudgeOnline/problem.php?id=1045
有n個小朋友坐成一圈,每人有ai個糖果。每人只能給左右兩人傳遞糖果。每人每次傳
遞一個糖果代價爲1,求使全部人得到均等糖果的最小代價。
分析:
假設a1分給an的糖果數爲k,則能夠獲得如下的信息:
  a1              a2                        a3           an-1              an
當前數目:a1-k           a2         a3           an-1              an+k
所需代價:|a1-k-ave| |a1+a2-k-2*ave| |a1+a2+a3-k-3*ave||a1+..+a(n-1)-k-(n-1)*ave|   |k|
以sum[i]表示從a1加到ai減掉i*ave的和值,這以上能夠化簡爲
總代價 = |s1-k|+|s2-k|+...+|s(n-1)-k|+|k|
不難看出:當k爲s1...s(n-1)中的中位數的時候,所需的代價最小

代碼轉載於網絡:

#include <cstring>

#include <iostream>

#include <algorithm>

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  

using namespace std;

const int X = 1000005;

typedef long long ll;

ll sum[X],a[X];

ll n;

ll Abs(ll x){

    return max(x,-x);

}

int main(){

    //freopen("sum.in","r",stdin);

    while(cin>>n){

        ll x;

        ll tot = 0;

        for(int i=1;i<=n;i++){

            scanf("%lld",&a[i]);

            tot += a[i];

        }

        ll ave = tot/n;

        for(int i=1;i<n;i++)

            sum[i] = a[i]+sum[i-1]-ave;

        sort(sum+1,sum+n);

        ll mid = sum[n/2];

        ll ans = Abs(mid);

        for(int i=1;i<n;i++)

            ans += Abs(sum[i]-mid);

        cout<<ans<<endl;

    }

    return 0;

}

Enjoy~

相關文章
相關標籤/搜索