(一)填空選澤題,一空一分
1、兩個人輪流拋硬幣,先拋出正面的贏,請問先拋的人贏的概率是________。
2、倘若你有一件武器,每使用一個材料,從1級到2級有90%概率成功,從2級到3級有80%,那么從1級武器升到3級所需材料的數學期望是________。
3、在一個正方體上取三個頂點構成三角形,該三角形是等腰非直角三角形的概率是________。
4、2
100 mod 7 = ________。
5、C++11 STL中map與unordered_map的區別,下列敘述正確的有________。
A 自定義類型作為unordered_map的key,需要實現相應的哈希函數和比較函數
B 兩者遍歷的輸出的結果都是有序的
C unordered_map內部為hash實現,map為紅黑樹實現
D unordered_map的查詢效率一定會比map的查詢效率要高
6、C調用C++函數時,需要給C++的函數聲明加上________,原因是________。
7、在C++ STL常用的容器中,下列哪些支持下標“[]”運算?________。
A vector
B list
C map
D set
E stack
8、計算機在內存中存儲數據有大端和小端模式之分,32位x86結構的計算機使用________模式,0x12345678對應的首字節是________。(提示:所填寫數字使用16進制表示)
9、給定程序段
則下列敘述正確的是:________。
A s和p完全相同
B 數組s中的內容和指針變量p中的內容相等
C s數組長度和p所指向的字符串長度相等
D *p和s[0]相等
10、關於C++11的異常,以下說法正確的有________。
A 析構函數不應該拋出異常
B exception類是所有異常類的父類
C 在catch塊無法將捕獲的異常重新拋出
D throw語句拋出的異常對象需要駐留在所有可能被激活的catch語句都能訪問到的特殊內存空間中
11、以下C代碼段的運行結果是________。
#define sum(a,b) a+b
int a = 5;
int b = 6;
int result = sum(a, b) * sum(a, b);
printf("%d\n", result);
12、關於C/C++的全局變量,下列說法正確的有________。
A 在函數或者類外定義的變量是全局變量
B 對於不同編譯單位的全局變量,編譯器會根據其依賴關系順序初始化
C 在cpp文件中用static修飾的全局變量的作用域為該文件
D 未初始化的全局變量會放在bss段,而已初始化的全局變量則會放在data段
13、給定如下代碼段,在64位編譯環境下,sizeof(B) = ________。(64位編譯環境下,sizeof(int) = 4)
class A{
public:
virtual void funcA(){}
int *p;
};
class B: public A{
int i;
char c;
}
14、關於C++程序,下列說法正確的有________。
A 數組下標越界是語法錯誤
B 構造函數不可以是虛函數
C 弱指針weak_ptr沒有重載operator*和->
D 賦值運算符只能作為類的成員函數重載
15、以下關於std::mutex,std::lock_guard的描述,正確的有________。
A mutex用於保護共享數據不會被多個線程訪問
B 在同一個線程中,可以連續調用一個mutex的lock函數而不產生死鎖
C lock_guard采用RAII對mutex進行封裝
D lock_guard析構時其對應的mutex也會析構
16、下面這段C++代碼的時間復雜度是________。
int x = 0;
for(int i = 1; i < n; i++)
for(int j = 1; j < n; j += n/2)
for(int k = 1; k < n; k = 2 * k)
x = x + 1;
17、關於插入排續、冒泡排續、快速排續這三個排續算法,下列說法正確的是________。
A 最壞情況下,他們的時間復雜度都是O(n
2)
B 最好情況下,他們的時間復雜度都是O(n)
C 最好情況下,他們的時間復雜度分別是O(n) O(n) O(nlog
2n)
D 平均情況下,他們的時間復雜度都是O(n
2) O(n
2) O(nlog
2n)
18、下列關於select/epoll說法正確的有________。
A select是同步IO,而epoll則是異步IO
B epoll和select都是I/O多路復用的技術,都可以實現同時監聽多個I/O事件的狀態
C epoll相比select效率更高,主要是基於其事件通知機制,而select則是基於輪詢機制
D select會隨着FD數目的增加而線性下降,而epoll則不會
A icmp B tcp C dns D arp
20、關於死鎖說法正確的有________。
A 出現並發***作時容易出現死鎖
B 數據庫系統不會出現死鎖
C 數據庫中防止死鎖的方法是禁止兩個用戶同時訪問
D 系統資源不足也是導致數據庫死鎖的原因之一
21、已知一表達式的前綴表達式為 +-*235/^234(
樓主注:這里的235和234是™六個一位數而不是兩個三位數,考場上沒想到,fuxk!),該表達式的值為________。
22、已知一個二維向量(x,y),請求出與之垂直的二維向量(順時針90度方向)________。
23、若事務T對數據對象A加上共享鎖,則________。
A 事務T可以讀A和修改A,其他事務只能再對A加共享鎖,而不能加排他鎖
B 事務T可以讀A但不能修改A,其他事務只能再對A加共享鎖,而不能加排他鎖
C 事務T可以讀A但不能修改A,其他事務(能)再對A加共享鎖和排他鎖
D 事務T可以讀A和修改A,其他事務(能)再對A加共享鎖和排他鎖
24、關於linux的靜態庫和動態庫,說法正確的有________。
A Linux的動態庫都是以ELF(Executable Linkage Format)存在的
B 多個應用程序引用同一份靜態庫,也在內存中存在多份拷貝導致空間浪費
C 可以用tar -czvf將目標文件(.o)打包成靜態庫文件
D 編譯動態庫的時候一定要加-fPIC參數,用於產生位置無關代碼
25、一棵二叉樹中續遍歷續列是bdfcgae,后續遍歷續列是bfdgeac,則該二叉樹的前續續列是________。
26、Linux下用GCC編譯和鏈接C/C++代碼,以下說法正確的有:
A 編譯是把C/C++源文件轉換成機器語言的過程,會生成以.o和.obj為后綴的目標文件
B 如果源文件中使用了未定義(definition)的外部符號(如變量或者函數),編譯時將會報錯
C 鏈接時會收集所有目標文件中的符號信息,並決議(resolve)每個目標文件中需要的符號信息
D 靜態鏈接時生成的可執行程序通常比動態鏈接時生成的可執行程序大
E 當鏈接庫有更新時,不管是靜態鏈接還是動態鏈接,都只需要替換鏈接庫文件即可,無需重新生成可執行程序
27、假設一個文件中字符和字符對應出現的次數如下:
字符 |
次數 |
字符 |
次數 |
'e' |
20 |
'u' |
16 |
'f' |
8 |
'a' |
2 |
'd' |
6 |
'c' |
10 |
江文件使用哈夫曼編碼/霍夫曼編碼后(要求對於任何節點,左子樹高度大於等於右子樹高度),f對應的編碼為________。
28、TCP建立連接的過程中,第二個報文的標記位是________。
29、下列關於TCP和UDP的描述,正確的是________。
A TCP和UDP都是基於IP協議的應用層協議
B UDP是datagram based的傳輸協議,所以網絡傳輸中的UDP報文不會被拆分成多段發送
C TCP提供了擁塞控制和流量控制機制
D UDP的不可靠傳輸體現為可能丟包,但協議會保證順序投遞
30、與文法 S->AB|AS, A->aA|a, B->b 等價的正則表達式是________。
31、下列代碼段在Linux中的運行結果會輸出________個*。
#include<stdio.h>
#include<unistd.h>
int main(int argc, char *argv[]){
int i;
for(i = 0; i < 2; i++){
fork();
printf("*\n");
}
return 0;
}
32、以下關於字符編碼說法正確的是________。
A 大寫字母A的UTF-16編碼和UTF-8編碼相同
B GBK編碼的漢字字符是雙字節的
C UTF-16編碼的字符是雙字節的
D UTF-8編碼的字符最少可以使用1個字節
33、給定有向圖的節點,鄰接情況及遍歷順序如下:
adj(s) = [a,c,d],
adj(c) = [e,b],
adj(b) = [d],
adj(d) = [c],
則從起點s開始的深度優先遍歷的順續為________。
34、以下哪些是對稱加密算法________。
A DES B AES C RSA D RC4
35、以下哪些程序可以為終端用戶提供HTTP服務?________
A Apache B Nginx C Node.js
D Tomcat E Lighttpd
36、在傳統的前向渲染流水線中,以下幾個過程執行的先后關系是________。
A 頂點渲染 B 像素渲染
C 光柵化 D 圖元組裝
37、假設有如下三張表:
Student(id, name, age) 學生表,
Course(id, name) 課程表,
SC(sid, cid, score) 成績表。
(a)對於被頻繁調用的查詢語句 SELECT * FROM SC WHERE score >= ? and sid = ?,最高效的索引是________。
(b)請寫出SQL語句查詢平均成績大於80分的學號________。
38、假設當前目錄一個用git管理的目錄,請用一條命令統計該目錄中git狀態是修改過(modified)的文件數量________。
39、以下屬於深度學習框架的有________。
A Tensorflow B Torch C PyPy D Docker
40、關於游戲引擎,下列說法正確的是________。
A 堡壘之夜(FORTNITE)和絕地求生(PUBG)都是采用unreal引擎開發的
B unity和unreal都是開源的游戲引擎
C unity和unreal既可以開發PC端游戲,也能開發移動端或web端游戲
D unity引擎中可以通過coroutine來實現多線程編程
41、以下網易出品的游戲中屬於MMORPG類型的有________。
A 逆水寒 B 夢幻西游 C 荒野行動 D 非人學園
42、網易游戲的口號是
A 用心創造快樂
B 游戲熱愛者
C 用心帶來快樂
D 游戲創造者
(二)二叉樹(8分)
已知一棵二叉樹的節點結構如下:
class TreeNode{
int value;
TreeNode *left;
TreeNode *right;
}
1、請實現方法左右翻轉這棵二叉樹,翻轉后的二叉樹是原樹的鏡像(3分)
3、請實現方法計算一顆二叉樹的寬度,即各層節點個數的最大值(3分)
(三)嚇跑的怪物(10分)
有一個關卡,玩家依次經過n個怪物,怪物不會主動攻擊玩家,擊敗怪物 i 可以獲得 p
i 分。但是擊敗它會嚇跑后面 f
i 只怪物,求解玩家最后可以獲得的最高分數。
例如有5只怪,擊敗分別能獲得2、4、3、2、2分,同時分別會嚇跑其后的0、3、1、0、0只怪物。如果玩家擊敗第1和第2只怪物,嚇跑了后面3只,那么只能獲得6分。
1、請描述你的算法,並給出時間復雜度(3分)
2、請用C/C++實現上述函數(7分)
(四)布爾表達式(12分)
給定一個布爾表達式字符串,這個布爾表達式只會包含‘&’、‘|’、‘!’、(、)和10個變量(用‘a’~‘j’表示),‘&’和‘|’是兩元操作符。‘&’表示當左右元素都為true時返回true,否則返回false;‘|’表示當左右有一個為true時就返回true;‘!’是一個一元操作符,表示對元素取反。
'!'的優先級大於'&'和‘|’,‘&’和‘|’優先級相同,‘!’的結合性為右到左,‘&’和‘|’為左到右。所有提供的表達式均合法,無空白字符且不為空。
該表達式符合的EBNF語法如下:
Expression => Term | Expression '|' Term
Term => Factor | Term '&' Factor
Factor => Sub | '!' Factor
Sub => Variable | '(' Expression ')'
Variable => 'a' | 'b' |...| 'j'
問題:
1、給出一個表達式字符串和每一個變量的值,請實現該函數(10分)
bool Calc(std::string& expr, std::vector<bool>& vals);
* expr表示這個布爾表達式,vals表示每個變量的值,a的值是vals[0],b的值是vals[1]等等,計算返回表達式的結果。
* 例如表達式為“a|(b&!c)”,a、b、c分別為false、true、false,結果返回true。
2、給出一個字符串表達式,判斷有多少個變量是實際影響計算結果的(2分)
int Count(std::string& expr);
* 例如表達式“a&((b|!b)|c)”,b和c的值是不影響表達式結果的,結果返回1。
(五)Skip List(10分)
In
computer science, a skip list is a
data structure that allows fast search within an
ordered sequence of elements. Fast search is made possible by maintaining a
linked hierarchy of subsequences, with each successive subsequence skipping over fewer elements than the previous one (see the picture below).
A skip list is built in layers. The bottom layer is an ordinary ordered
linked list. Each higher layer acts as an "express lane" for the lists below, where an element in layer i appears in layer i+1 with some fixed probability p (two commonly used values for p are 1/2 or 1/4.
A search for a target element begins at the head element in the top list, and proceeds horizontally until the current element is greater than or equal to the target. If the current element is equal to the target, it has been found. If the current element is greater than the target, or the search reaches the end of the linked list, the procedure is repeated after returning to the previous element and dropping down vertically to the next lower list. The expected number of steps in each linked list is at most 1/p, which can be seen by tracing the search path backwards from the target until reaching an element that appears in the next higher list or reaching the beginning of the current list. Therefore, the total expected cost of a search is (log1/p n)/p which is O(log n), when p is a constant.
Now you need to implement the skip list with insert(4分), search(3分) and remove(3分) operation. For your convenience, the value of skip list is an integer.
(六)養豬(15分)
為了讓大家吃上放心的豬肉,知名青年企業家甲淼(丁磊)在某地郊區建設了標號不重復的1到n的多個養豬場。為了方便管理和運輸,這些養豬場之間准備n條修建道路相互連接起來。但現在甲先生覺得道路圖紙有些問題,因為要連接所有主場只需要n-1條道路就夠了,所以圖紙上有一條道路是多余的。現在他想取消圖紙上這條道路,你可以幫他找到多余的道路嗎?
這里,道路用二元組的形式記錄,如[i]號到[j]號養豬場的道路記為[i, j],甲先生保證j > i。整個道路圖紙用表示道路的二元組組成的數組表示,比如現在有4個養豬場,有道路圖紙[[3, 4], [2, 3], [1, 2], [1, 3]],可視化圖形如下所示:
(圖自己畫)
問題:
1、現在甲先生想找到這條多余的道路,如果有多個道路都可以判定為多余,請給出最后出現在圖紙中的道路。比如以上示例中[1, 2], [2, 3], [1, 3]都可以是多余邊,但只接受[1, 3]為答案(出現在二元數組中的順序更靠后)。請給出解決方案,請用偽代碼或者編程語言描述你的算法,要求算法的時間和空間復雜度盡可能低。(5分)
2、現在甲先生改變了需求,他准備選澤其中一個養豬場改造為養雞場,養雞作為飼料並向其他豬場運輸。處於各方面的考慮,甲先生現在要求所有道路只能單向通行,現在道路[i, j]表示只能從[i]號豬場到[j]號。比如原來4個養豬場的圖紙現在就改為[[2, 1], [1, 3], [3, 4], [3, 2]],可視化圖形如下所示:
(圖自己畫)
那么現在仍然有一條道路是多余的,並且飼料廠需要修建在能夠到達所有豬場的地方,現在請找出這條多余的道路以及刪除道路后應該被改造為飼料廠的豬場編號。如果有多個道路都可以判定多余,則請給出最后出現在圖紙中的道路。請給出解決方案,請用偽代碼或者編程語言描述你的算法,要求算法的時間和空間復雜度盡可能低,允許調用在問題1已經編寫的函數。(10分)