2013阿里筆試題

2013阿里巴巴暑期實習筆試

答題說明: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操作系統

  解析:DVD的1x是1350KB,16x是21600KB,就算是21.6MB好了=160Mbps

 

這圖明顯說明是20GB/s=160Gbps;

感受內存尚未硬盤快呢

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

  A.共享內存

  B.命名管道

  C.信號量

D.臨界區

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

 

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

  A.O(n3)

  B.O(n2lgn)

  C.O(n2)

  D.O(nlgn)

  解析:O(N2)的算法能想一大堆,雖然最終我選的C,好比說用hash的話,三維遍歷能夠輕鬆編程二維遍歷,可是總感受是否是應該有nlgn的算法。

  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必勝?

  A.2013 B.2886 C.4026 D......E.....(選項不記得)

  3、填空問答題

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

  void revense(int * a,int n) {

  }

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

  解答:這個問題等價於找未知序列數中的最小數,咱們將reg這個函數等價爲如下過程:,若是i認識j,記做i大於等於j,一樣j不必定大於等於i,知足要求,i不認識j記做i

  int finds(S,N)

  {

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

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

  for(i=1;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中的位置

}

int cha()

{

int i=1;j=N;

while(i<=N)

{

  if(know(i,j))

 i++;//認識就問下一我的

else

j--;//不認識就問是否定識前一我的;

if(0==j)

return I;

break;

}

}

思路就是:從第一我的開始問,是否定識最後一我的,

若認識,說明確定不是明星,放棄他,去問第二我的;

若不認識,再問是否定識第n-1我的,若認識說明還不是明星;不認識繼續問是否定識第n-2我的;

當找到明星時,確定把全部人問遍了,(設每一個人不問本身),j此時爲0;

跳出循環,返回明星的位置;

 

最快是第一個位置是明星,問了n-1次;

最差是最後一個是明星,並且剩餘的人都互相認識,這樣就問了(n-1)*(n-1)次,最後一個確定是明星了,不用再問。

這種方式跟明星位置和剩餘人之間認識度有關。。。。。

 

  4、綜合題

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

 

  思路:這個在各類online-judge平臺上都有答案,純粹的數學問題,

  如圖,這是一個倉庫分佈的模擬,假設從第i個倉庫向第i+1個倉庫轉移的物品爲Pi個單位,其中Pi爲負表示思是從i+1個倉庫轉移到第i個倉庫,第n個倉庫轉移到第一個倉庫即爲Pn,設最後每一個倉庫平均後的貨物爲ave個單位,則有要最小化|P1|+|P2|+…+|Pi|+…+|Pn|

  ave[i]=ave=A[i]-Pi+Pi-1//平均就是每一個點收到(前一個節點發出)的和本節點發出的,加上本節點原有的

  ave[1]=A[1]-P1+Pn//第一個節點的平均

  而後設W[i]=ave[i]-A[i]=-Pi+Pi-1//每一個節點發出和收到的差值

  因而S[i]=W[1]+W[2]+….W[i]=Pn-Pi//全部前i個節點發出收到的差值之和

  即Pi=Pn-S[i] ,因此問題歸結到最小化|Pn-S[1]|+|Pn-S[2]|+…+|Pn-S[n]|

因此Pn是S中位數的時候最小//pn是最後一個節點發給節點1的。

 

實現了可是出不來結果、、、

#include <cstdlib>

#include <iostream>

#include <math.h>

#include <algorithm>

using namespace std;

 

const int N=100;  //定義數組大小

int input[N];   //輸入的每一個倉庫原始的貨物量

int sum=0;      //全部倉庫總貨物量

int s[N];       //前i個節點獲得和發出只差的和==這個差就是原有-平均

int avg;

int n;

void sort(int data[],int len)

{

     for(int i=0;i<len;++i)

     {      

              for(int j=0;j<len-i;++j)

             {

                     if(data[j]>data[j+1])

                     data[j]=data[j]^data[j+1];

                     data[j+1]=data[j]^data[j+1];

                     data[j]=data[j]^data[j+1];

             }

     }

}

int main(int argc, char *argv[])

{

   

    while(cin>>n)

    {  //n個倉庫

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

       {

        cin>>input[i];

        sum=sum+input[i];

        avg=sum/n;   //平均值

        }

        avg=sum/n;

    }

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

    {

            s[i]=input[i]+s[i-1]-avg;//前i個節點的差值之和

    }

    sort(s,5);//對數組值從小到大排序

    int mid=s[n/2];//取中值

    mid=abs(mid);

    int res=0; 

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

        {

                res+=abs(mid-s[i]);

                }

                cout<<"最小代價是: "<< res;

    system("PAUSE");

    return EXIT_SUCCESS;

}

相關文章
相關標籤/搜索