阿里巴巴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~