阿里巴巴2014校招筆試題-2013年9月14日

參考:http://flyown34317.blog.163.com/blog/static/19707301620139112402917/node

 

 

1 假設把整數關鍵碼K散列到有N個槽的散列表,如下哪些散列函數是好的linux

A、h(k)= k/N算法

B、h(k)   =1;數據庫

C、h(k)=kmod N數組

D、h(k)= (K+Random(N)) modN,Random(N)返回0-N-1的整數,緩存

2 下面的排序算法中.初始數據集的排列順序對算法的性能無影響的是服務器

A 堆排序網絡

B 冒泡排序數據結構

C、插入排序dom

D、快速排序

 

 

3.下面說法錯誤的是_。

A、ClSC計算機比RISC計算機指令多

B、在指令格式中,採用擴展操做碼設計方案的目的是爲了保持指令字長度而增長尋址空間.

C、增長流水線段數理論上能夠提升CPU頻率

D、馮.諾依曼機體系結構的主要特徵是存儲程序的工做方式

4.不屬於馮.諾依曼機體系結構必要組成部分的是_。

A、CPU B、Cache C、RAM D、ROM

輸入數據和程序的 輸入設備
記憶程序和數據的 存儲器
完成數據加工處理的 運算器
控制程序執行的 控制器
輸出處理結果的 輸出設備

 

 

5.一個棧的入棧序列爲ABCDE則不可能的輸出序列爲_。

A、DECBA  B、DCEBA  C、ECDBA  D、ABCDE

6.你認爲能夠完成編寫一個C語言編譯器的程序設計語言是_.

A、彙編語言 B、C語言 C、VB語言 D、以上皆可

第一個C語言編譯器應該是用匯編寫的,可是第一個成熟的C語言編譯器應該是由彙編和C語言共同寫的。 編譯原理講到了「自舉編譯器」。大意就是先用底層語言(應該是彙編)寫一個能運行,但效率極低的C語言編譯器(底層語言很差優化),有了C語言的編譯器之後,就能夠用C語言好好寫一個編譯器了,用以前那個運行沒問題,但效率低得編譯器編譯一下,就獲得了可使用的編譯器了。

第一個C的編譯器前10%是用匯編寫的,後90%使用C寫的,只要把必要的核心組件彙編了,之後部分就用滾雪球的方式編寫,之後的C編譯器基本都是用C寫的了。

 

 

 

7.關於C++/JAVA類中static成員和對象成員的說法正確的是:

A、static成員變量在對象構造時生成

B、static成員函數在對象成員函數中沒法調用

C、虛成員函數不多是static成員函數

D、staric成員函數不能訪問static成員變量

 C++類中談到static,咱們能夠在類中定義static成員,static成員函數!C++primer裏面講過:static成員它不像普通的數據成員,static數據成員獨立於該類的任意對象而存在,每一個static數據成員是與類關聯的對象,並不與該類的對象相關聯!這句話可能比較拗口,其實能夠這麼理解:每一個static數據成員能夠當作是類的一個對象,而不與該類定義的對象有任何關係!下面咱們就來具體看看類中的static數據成員!

不管建立多少個對象,static成員只有一份拷貝

靜態數據成員在編譯時建立並初始化,也就是在該類的任何對象以前就初始化好了。

【引用】http://hi.baidu.com/yyzz990/item/46739ce019d536f52b09a472

靜態函數
用static聲明的函數是靜態函數。靜態函數能夠分爲全局靜態函數和類的靜態成員函數。

Static關鍵字
在類中,用static聲明的成員變量爲靜態成員變量,它爲該類的公用變量,在第一次使用時被初始化,對於該類的全部對象來講,static成員變量只有一份。
用static聲明的方法是靜態方法,在調用該方法時,不會將對象的引用傳遞給它,因此在static方法中不可訪問非static的成員。
靜態方法再也不是針對於某個對象調用,因此不能訪問非靜態成員。
能夠經過對象引用或類名(不須要實例化)訪問靜態成員

爲何虛函數必須是非靜態成員函數
若是定義爲虛函數,那麼它就是動態綁定的,也就是在派生類中能夠被覆蓋的,這與靜態成員函數的定義自己就是相矛盾的。

 

 

8 假設下圖中每一個正文形的連長爲1,則從A到Z的最短路徑條數爲()

A、11 B、12 C、13 D、14

 

就是把這個圖轉換爲有向圖,方向指向Z,而後進行深度優先遍歷,結果到達Z的條數。

 

9,某進程在運行過程當中須要等待從磁盤讀入數據,此時該進程的狀態將()

   A,從運行變爲阻塞  B,從運行變爲就緒  C,從就緒變爲運行  D,從阻塞變爲就緒

10,下面算法的時間複雜度是()

   Int f (unsigned int n){

     If( n == 0 || n == 1){

         Return 1;

}else return n*f(n-1);

}

 A,O(1)  B,O(n)  C,O(n^2)  D,O(n!)

 

十、 能夠得出遞歸深度爲n,每次遞歸只有一次操做,因此是O(n)

 

 

 

11n1開始,每一個操做能夠選擇對n1,或者對n加倍,若是想得到整數2013,只須要()個操做

  A,18  B,24  C,21  D不可能

A     從2013開始,遇到偶數除2,遇到奇數-1.20十二、100六、50三、50二、25一、250、12五、12四、6二、3一、30、1五、1四、七、六、三、二、1.    18次操做

 

將2013轉換成二進制序列111 1101 1101 "1"的個數表示加1的次數,爲8,一共有11位,須要向右移10次。因此18次。

 

 

12,對於一個具備n個頂點的無向圖,若採用鄰接表表示,則存放表頭結點的數組的大小爲()  

A,n  B,n+1  C,n-1  D,n+邊數

 

 

13,考慮一個特殊的hash函數h,能將任一字符串hash成一個整數k,其機率P(k) = 2 ^(-k)k=1,2,3….對一個未知大小的字符串集合S中的每個元素取hash值所組成的集合爲h(S)。若h(S)中最大的元素maxh(S) = 10,那麼S的大小的指望是()

A,5  B,10  C,512  D,1024

對於幾何中的每一個字符串取hash能夠看做是同分布的獨立重複事件,因此每個事件出現10的機率都是p=1/1024,那麼當出現的時候,指望的次數就是1/p,1024

 

 

 

14,以下函數,在32bit 系統foo(2^31-3) 的值是()

   Int foo(int x){

     Return x&-x;

}

A,0  B,1  C,2  D,4

 

參考答案:C,首先-號比^的優先級高,因此實參應該是2^28,而C++中並無冪指數的運算符,這個^只表示異或運算,因此實參的二進制值,

x的值爲  0000 0000, 0000 0000, 0000 0000,0000 0010

               -x 的值爲 1111 1111, 1111 1111, 1111 1111, 1111 1110

 x&-x; 0000 0000, 0000 0000, 0000 0000,0000 0010

即爲2。

因此答案爲C

 

 

 

 

 

15,對於順序存儲的線性數組,訪問結點和增長,刪除結點的時間複雜度()

   A,O(n),O(n)  B,O(n),O(1)  C,O(1)、O(n)   D,O(1),O(1)

16,在32位系統環境,編譯選項爲4字節對齊,那麼sizeof(A)sizeof(B)是()

   Struct A{

                   Int a;

                   Short b;

                   Int c;

                   Char d;

};

Struct B{

            Int a;

            Short b;

            Char d;

            Int c;

};

A,16,16  B13,12  C,16,12  D,11,16

爲保證4字節對齊,A中的b d都須要補齊,因此要16,B中,bd佔用3個字節以後再補一個就能夠了,因此12個

 

17,袋中有紅球,黃球,白球個1個,每次任取一個又放回,如此連續抽取3次,則下列時間中機率是8/9的是()

A, 顏色全相同  B,顏色不全相同  C,顏色全不一樣  D,顏色無紅色

18,一個洗牌程序的功能是將n張牌的順序打亂。一下關於洗牌程序的功能定義說法最恰當的是()

A, 每張牌出如今n個位置上的機率相等   

B, 每張牌出如今n個位置上的機率獨立     //這樣會出現幾張牌在一個位子上

C, 任何連續位置上的兩張牌的內容獨立    //出現相同

D, N張牌的任何兩個不一樣的排列出現的機率相等

19,用兩種顏色去染排成一個圈的6個旗子,若是經過旋轉獲得則只算一種,問一共有多少種染色模式。 

A,10  B,14  C,15  D,16

 

答案共14種

 

分析:題目意思是說旋轉後相同的顏色排布算一種。至關於棋子沒有區別,只有位置的相對關係。

 

設兩種顏色爲黑白

 

全黑1種+全白1種=2

 

1黑5白(1種)+1白5黑(1種)=2種

 

2黑4白(2個黑的能夠緊挨着,2個黑的中間隔1個棋子,兩個黑的中間隔2個棋子)共3種

 

4黑2白同2黑4白對稱:3種

 

3黑3白:3個黑的連在一塊兒(1種),3個黑的任意兩個之間不相鄰(1種),3個黑的有兩個挨着,另一個與這兩個棋子都不相鄰(2種)

 

共4種

 

特別是另一個與這兩個棋子都不相鄰的狀況,有兩種,剛開始覺得是對稱的算一種了,而其實是兩種,由於這種經過旋轉是轉不到同樣的。

 

因此總共有2+2+3+3+4=14種

 

 

20,遞歸式的先序遍歷一個n節點,深度爲d的二叉樹,須要棧空間的大小爲()

A,O(n)  B,O(d)  C,O(logn)  D,O(nlogn)

 

 

二,不定項選擇

21,兩個線程運行在雙核機器上,每一個線程主程序以下,線程1x=1;r1=y;線程2:y=1;r2=xxy是兩個全局變量,初始化爲0,一下哪個是r1r2的可能值()

A,r1=1,r2=1  B,r1=1,r2=0  C,r1=0,r2=0  D,r1=0,r2=1

22,關於linux系統的負載(LOAD),如下表述正確的是()

A, 經過就緒和運行的進程數來反映

B, 能夠經過TOP命令查看

C, 能夠經過uptime查看

D, Load:2.5 1.3 1.1 表示系統的負載壓力在逐漸減少

23,關於排序算法的一下說法,錯誤的是()

A: 快速排序的平均時間複雜度O(nlogn),最壞O(N^2)

B:堆排序平均時間複雜度O(nlogn),最壞O(nlogn)

C:冒泡排序平均時間複雜度O(n^2),最壞O(n^2)

D:歸併排序的平均時間複雜度O(nlogn),最壞O(n^2)

答案: D

 

 

24,假定函數rand_k 會隨機返回一個[1,k]之間的整數(K >= 2),而且每一個整數值出現的概率相等。已知目前有rand_7的實現,請問經過調用rand_7和四則運算函數,並適當增長邏輯判斷和循環等控制邏輯,下來函數能夠實現的有()

   A,rand_3  B,rand_21  C,rand_23  D,rand_47

 

三,填空與問答

 

25、某二叉樹的前序遍歷序列爲+a*b-cd/ef,後序遍歷序列爲abcd-*+ef/-,問其中序遍歷序列是:a+b*c-d-e/f

阿里筆試 - flyown34317 - 折柳家園

 

26、某緩存系統採用LRU淘汰算法,假定緩存容量爲4,而且初始爲空,那麼在順序訪問如下數據項的時候,151352412,出現緩存直接命中的次數是(),最後緩存中即將準備淘汰的數據項是()

答:直接命中的次數是3次,分別是訪問151352412時。最後緩存中即將準備淘汰的數據項是5

 

 

27、有兩個較長的單向鏈表ab,爲了找出節點node知足node in a 而且 node in b,請設計空間使用盡可能小的算法。(用C/C++/JAVA或僞碼錶示均可以)

答:node in a 而且node in b,就是求兩個鏈表的公共節點吧

就是先分別遍歷一遍鏈表A和鏈表B,在遍歷時分別記下鏈表AB的長度,而且在最後看看鏈表A和鏈表B的最後一個節點是否是相同,若是相同則有公共節點,若是不一樣就沒有公共節點。

找公共節點就是再利用兩個指針,根據遍歷時記錄的長度,找到第一個公共節點,這個節點後面的就都是公共節點了。

 

struct ListNode{
	int data;
	struct ListNode* next;
};
typedef struct ListNode ListNode;
ListNode* findSameNode(ListNode *ahead, ListNode *bhead)
{
	ListNode *ap = ahead;
	ListNode *bp = bhead;
	
	int alen = 1,blen = 1;
	
	if(ahead == NULL) return NULL;	  	
 	if(bhead == NULL) return NULL;
 	
 	while(ap->next != NULL)
 	{
 		alen++;
 		ap = ap->next;
 	}
 	while(bp->next != NULL)
 	{
 		blen++;
 		bp = bp->next;
 	}
 	if(ap != bp)
 		return NULL;
	
 	if(alen > blen)
 	{
 		alen = alen - blen;
 		ap = ahead;
 		while(alen--)
	 	{
	 		ap = ap->next;
	 	}
	 }
	 if(blen > alen)
 	{
 		blen = blen - alen;
 		bp = bhead;
 		while(blen--)
	 	{
	 		bp = bp->next;
	 	}
	 }
	 //
	 while(ap != bp)
	 {
	 	ap = ap->next;
	 	bp = bp->next;
	 }
	 return ap;		
}

 

  

 

 

28、當存儲數據量超出單節點數據管理能力的時候,能夠採起的辦法有數據庫sharding的解決方案,也就是按照必定的規律把數據分散存儲在多個數據管理節點N中(節點編號0.1.2...N-1)。假設存儲的數據是a,請完成爲數據a計算存儲節點的程序。(沒學過C語言的同窗也能夠用僞碼完成)

#define N 5

int hash(int element)

{

 return element*2654435761;

}

int shardingIndex(int a)

{

 int p = hash(a);

 //1

 return p;

}

 

空格1處: p %= N;

 

29、宿舍內5個同窗一塊兒玩對戰遊戲,每場比賽有一些人做爲紅方,另外一些人做爲藍方,請問至少須要多少場比賽,才能使任意兩我的之間有一場紅方對藍方和一場藍方對紅方的比賽?

答案爲4場。

分析見下圖:箭頭表示一場紅對藍的比賽,(<- A B ->)表示AB紅對藍一場,BA紅對藍一場,帶黑點的表示重複了一場比賽,具體的4場比賽見右邊的4個圖。

 

阿里筆試 - flyown34317 - 折柳家園

 

 

分析:一次劃分中,某方能夠有1人,另外一方有4人或某方有2人,另外一人有3人。

要使任意兩我的之間有一場紅方對藍方和藍方對紅方的比賽,假設5個同窗爲A,B,C,D,E,至關有有向圖的5個節點,任意兩個節點間有兩個方向的邊鏈接。

即總的節點關係有(5個節點中選取兩個節點)A(5,2)=5*4=20個關係。

而一次比賽(一次劃分)可以生成的關係(一方兩人一方三人的劃分)c(2,1)*c(3,1)=2*3=6或者(一方四人一方一人的劃分)c(4,1)*(c(1,1)=4*1=4,

因此一場比賽(一次劃分)最多生成的關係次數爲6

因此須要20/6=3.33..即至少須要4場比賽

 

 

 

C++選作題
Part I
假設你有一臺計算機,配置以下:
48GB內存
16核CPU,3.0GHz
12塊2TB SATA硬盤
有兩個數據文件A和B,A的大小是40GB,B的大小是2TB,A和B的文件格式同樣,都包含等長的100字節的記錄,記錄的前20個字節表示key,後 80個字節表示value,全部的key和value都由數字和大小寫字母組成(0-9 A-Z a-z),同一個文件中的key沒有排序,也沒有重複。
文件A和B都切成了1GB(1*10^9字節)的數據塊(名爲A00000一、A000002......A0000十、B00000一、B000002......B002000),均勻分佈在6塊硬盤上。
請問如何用最快的方法找到A和B之間共同的key,以及他們對應的value值(建議輸出格式以下所示:<key><空格><A中對應value><空格><B中對應value>)


請描述你的方法裏面用到的關鍵的數據結構和算法,估算這個方法須要的內存空間和運算時間,並說明你的推導過程。


Part II
若是你有100臺服務器,每臺配置如上描述,它們經過千兆網絡組成一個集羣,任意兩臺之間的帶寬能夠達到1000Mbps,同時假設文件A和B的大小也放大100倍(各位4TB和200TB),而且被切分紅1GB的碎片,均勻分佈在100臺服務器上。
請問如何用最快的方法找到A和B之間共同的key,以及他們對應的value值(建議輸出格式以下所示:<key><空格><A中對應value><空格><B中對應value>)


請描述你的方法裏面用到的關鍵的數據結構和算法,估算這個方法須要的內存空間、網絡流和運算時間,並說明你的推導過程。

相關文章
相關標籤/搜索