轉】阿里哈爾濱2014筆試題及【原創】答案

1. 單選題java

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

A: h(K)=K/N;c++

B: h(K)=1;算法

C: h(K)=K mod N;數據庫

D: h(K)=(K+rand(N)) mod N, rand(N)返回0N-1的整數數組

答案:d 數據結構

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

A: 堆排序 B:插入排序性能

C: 冒泡排序 D:快速排序spa

答案:a 

3. 下面說法錯誤的是:

A: CISC計算機比RISC計算機指令多

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

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

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

答案:b,緣由 擴展操做碼的設計方案目的是保持指令字長度不變而增長指令操做的數量 

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

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

答案:a和d都該選,b和c我以爲該選b,由於cache是高速緩衝存儲器,存取速度高於ram,馮諾依曼當時的cpu頻率尚未那麼快,cache還沒出來,因此我以爲該選b 

5. 一個棧的入棧序列式ABCDE則不可能的出棧序列是:

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

答案:c 

6.你認爲能夠完成編寫一個C語言編譯器的語言是:

A:彙編 B:C語言 C:VB D:以上全能夠

答案:我以爲該選a

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

Astatic成員變量在對象構造時候生成

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

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

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

答案:c 

8:看不清

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

A: 從就緒變爲運行  B:從運行變爲就緒

C: 從運行變爲阻塞  D:從阻塞變爲就緒

答案:c 

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*N)  D:O(n!)

答案:b 

11: n1開始,每一個操做能夠選擇對n1或者對n加倍。若想得到整數2013,最少須要多少個操做。

A:18    B:24   C:21  D;不可能

答案: d

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

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

答案:a 

13:不全

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

Int foo(int x)
{

Return x&-x;

}

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

答案:a,x的值爲11111111111111111111111111111110-011 =          01111111111111111111111111111101 

               -x 的值爲 0-x = 0-  01111111111111111111111111111101 = 10000000000000000000000000000010

因此答案爲0 

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

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

答案:c 

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

Struct A
{

Int a;short b;int c;char d;

};

Struct B
{int a;short b;char c;int c;};

A: 16,16    B:13,12   C:16,12 D:11,16

答案:c

17:袋中有紅球,黃球,白球各一個,每次任意取一個放回,如此連續3次,則下列事件中機率是8/9的是:

A: 顏色全相同 B:顏色全不相同C:顏色全相同D:顏色無紅色

答案:a的機率是1/3*1/3*1/3  b的機率是1/3*1/3*1/3 ...轉載的這我的題目有問題,8/9機率的提法應該是 顏色不全爲xx顏色的機率。 

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

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

B: 每張牌出如今n個位置上的機率獨立

C: 任何連續位置上的兩張牌的內容獨立

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

答案:我的見解是a

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

A: 10 B:11 C:14: D:15

答案:15 

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

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

答案:c,有左孩子就壓棧 

第二部分:多選

21:兩個線程運行在雙核機器上,每一個線程主線程以下,線程1x=1;r1=y;線程2y=1;r2=x;

Xy是全局變量,初始爲0。如下哪個是r1r2的可能值:

A: r1=1,r2=1

B: r1=1,r2=0

C:r1=0,r2=0

D:r1=0,r2=1

個人答案:bd

22.關於Linux系統的負載,如下表述正確的是:

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會隨機返回一個【1k】之間的隨機數(k>=2,而且每一個證書出現的機率相等。目前有rand_7,經過調用rand_7()和四則運算符,並適當增長邏輯判斷和循環控制邏輯,下列函數能夠實現的有:

A:rand_3 B:rand_21  C:rand_23  D:rand_49


3.(6分)兩個較長的單向鏈表a和b,爲了找出及誒單noed知足node in a
而且node in b。請設計空間使用盡可能小的算法(用c/c++,java 或者僞代碼)

答案網上找的

咱們定義節點的距離爲節點到鏈表開始所通過的節點數。若是兩個鏈表長度相同,則相交節點其在兩個鏈表上的距離必定相等。對於長度不一樣的兩個鏈表,咱們能夠採用對齊的方式,使其向長度短的鏈表對齊。這樣就能夠應用上面的思路。具體算法以下:

C/C++ code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
struct  node  
{  
     int  v;  
     node *next;  
};  
/* 
返回鏈表的長度 
鏈表爲空 返回0 
*/  
size_t  listLen(node * p)  
{  
     size_t  num = 0;  
     while  (p!=NULL)  
     {  
         num++;  
         p = p->next;  
     }  
     return  num;  
}  
// 若是找到了 則返回指針 指向公共節點  
// 若是不存在 則返回空指針  
node * findFirstCommenNode(node * pheada, node * pheadb)  
{  
     size_t  lenA = listLen(pheada);  
     size_t  lenB = listLen(pheadb);  
   
     node * plistA = pheada;  
     node * plistB = pheadb;  
     //調整長度  
     //plistA 指向較長的一個  
     if  (lenA < lenB)  
     {  
         plistB = pheada;  
         plistA = pheadb;  
         size_t  t = lenA;  
         lenA = lenB;  
         lenB = t;  
     }  
     while (lenA > lenB)  
     {  
         plistA = plistA->next;  
         --lenA;  
     }  
     //同樣長了  
     //尋找公共節點  
     while  (plistA!=NULL && plistA != plistB)  
     {  
         plistA = plistA->next;  
         plistB = plistB->next;  
     }  
     return  plistA;  
}  


算法的空間複雜度O(1),時間複雜度O(m+n),效果不錯吧。

二、當存儲數據量超出單節點數據管理能力的時候,能夠採用的辦法有數據庫
sharding的解決方案,也就是按照必定的規律把數據分散存儲在多個
數據管理節點N中(節點編號爲0,1,2,,,,N-1)。
假設存儲的數據時a  請完成爲數據a計算存儲節點的程序。

C/C++ code
?
1
2
3
4
5
6
7
8
9
#define N 5
int  hash( int  element){
    return  element*2654435761;
}
int  shardingIndex( int  a){
     int  p = hash(a);
     _________________________;  //這裏是空格
     return  p;
}


求高手指點

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

四、一個有10億條記錄的文本文件,已按照關鍵字排好序存儲。請設計算法,能夠快速的從文件中查找指字關鍵字的記錄

相關文章
相關標籤/搜索