1. 程式人生 > >網易遊戲(雷火、盤古、伏羲)9月線下筆試真題(遊戲開發方向)

網易遊戲(雷火、盤古、伏羲)9月線下筆試真題(遊戲開發方向)

(一)填空選澤題,一空一分

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、給定程式段
char
s[] = "Netease"; char *p = s;

 

則下列敘述正確的是:________。 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則不會

19、計算機啟動後第一次呼叫ping www.163.com命令,會用到哪些網路協議?________ 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分)  
void invert(TreeNode *t)

 

2、請實現方法判斷兩棵二叉樹是否相同(2分)  
bool equal(TreeNode *t1, TreeNode *t2)

 

3、請實現方法計算一顆二叉樹的寬度,即各層節點個數的最大值(3分)
int calc_width(TreeNode *t)

 


(三)嚇跑的怪物(10分) 有一個關卡,玩家依次經過n個怪物,怪物不會主動攻擊玩家,擊敗怪物 i 可以獲得 p i 分。但是擊敗它會嚇跑後面 f i 只怪物,求解玩家最後可以獲得的最高分數。 例如有5只怪,擊敗分別能獲得2、4、3、2、2分,同時分別會嚇跑其後的0、3、1、0、0只怪物。如果玩家擊敗第1和第2只怪物,嚇跑了後面3只,那麼只能獲得6分。  
//    p和f的長度都是n,並且i + f[i] < n
int calc(vector<int> &p, vector<int> &f)
  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分)