⼴州乐享元游-校招-C++服务端开发⼯程师笔试
⼀、选择题(共19道)
1. 问你第⼀志愿
2. 问你第⼆志愿
3.1、⼀个经常通过书名查询书籍信息的图书管理系统,哪种数据结构存储书数据(A) A. 树 B. 链表 C. 忘记了 D. 忘记了
3.2、Linux⽬前⼤规模⽹络并发程序开发的⾸选IO模型是(C) A. select B. poll C. epoll D. blocking IO 解析: 采⽤了IO多路复⽤epoll模型,epoll是Linux⽬前⼤规模⽹络并发程序开发的⾸选模型。在绝⼤多数情况下性能远超select和poll。epoll的底层实现为红⿊树。
3.3、问abcdef进栈后不可能的出栈顺序(选项忘了)
3.6、玩家t表有play_id、item_id两个字段,现查询每个玩家各⾃拥有的物品数量(select play_id, count(*) from t groud by play_id)(选项忘了)
3.7、下⾯哪项关于主键的选项是错的(A) A. ⼀个主键只能包含⼀个字段 B. ⼀个表只能有⼀个主键 C. 忘记了 D. 忘记了 解析: 有将两个字段当成⼀个主键的情况
3.8、下⾯哪项关于线程的选项是错的(A) A. ⼀个线程死循环导致另⼀个线程⽆法运⾏ B. 进程是分配资源最⼩单位 C. ⼀个进程包含多个线程 D. 线程是程序最⼩单位 解析: 对于D:线程是操作系统能够进⾏运算调度的最⼩单位,分配算⼒、执⾏调度以线程为单位。 对于B:进程是正在运⾏的程序的实例,是线程集合的载体,同时也是操作系统分配资源的基本单位。 对于C:进程可以有多个线程,但⾄少有⼀个主线程。
3.9、下⾯哪项是错误的(C) A. 智能指针可以创建对象 B. 智能指针可以删除对象 C. 智能指针可以避免内存泄漏(还是“可避免内存泄漏”具体忘记了) D. 智能指针在引⽤计数为0时删除对象 解析: 当两个对象使⽤⼀个shared_prt成员变量指向对⽅,会造成循环引⽤,使引⽤计数失效,从⽽导致内存泄漏。不知道对不对 参考:⽜客上的C++⾯试题 四个智能指针:
auto_ptr(被弃⽤)、shared_ptr、weak_ptr、unique_ptr(替换auto_ptr) 智能指针可以很⼤程度上的避免内存泄漏问题! unique_ptr保证同⼀时间内只能由⼀个智能指针可以指向改对象。 shared_ptr实现了多个智能指针可以指向相同对象,当计数为0时,资源会被释放掉。 weak_ptr指向⼀个shared_ptr管理的对象,其构造和析构不会引起引⽤计数的增加或减少。
3.11、下⾯代码是什么排序(A) void func(int arr[], int n){ int i; for (int j = 1; j<n; j++){ i = j - 1; key = arr[j]; while (i>=0 && key < arr[i]){ arr[i+1] = a[i]; i--; } a[i+1] = key; } } A. 插⼊排序 B. 忘记了 C. 忘记了 D. 归并排序
3.12、⼆分查长度为1000的序列,最坏情况下需要查(10)次。(选项忘了)
3.13、下⾯程序在两个线程中执⾏,不可能输出(D)结果。 int count = 0; for (int i = 0; i < 100; i++) { count++; } cout<< count << endl;
A. 10
B. 100
C. 199
D. 201
3.18、现有1000瓶药⽔,其中有⼀瓶是毒药⽔,⼩⽩⿏喝了后在24⼩时后⽴即死亡,⾄少需要多少只⼩⽩⿏才能知道哪⼀瓶是毒药⽔(A)。 A. 10 B. 100 C. 200 D. 500 解析: 10
只⼩⽩⿏,则每只喝100瓶药⽔,死⼀只,剩9只⼩⽩⿏和100药⽔要区分;9只⼩⽩⿏,每只喝11瓶,剩1瓶未区分,有下⾯两种情况: 1. 死⼀只,剩下8只⼩⽩⿏和11瓶要区分的药⽔,因为只有1瓶毒药⽔,已经有⼩⽩⿏死亡,说明剩下⼀瓶药⽔不是毒药⽔。之后每只喝1瓶,剩3瓶未区分,有下⾯两种情况:
1.1 死⼀只,剩下7只⼩⽩⿏并确定毒药⽔。 1.2 没有⼩⽩⿏死亡,剩下8只⼩⽩⿏和3瓶药⽔要区分。之后3只⼩⽩⿏各喝⼀瓶即可区分。
2. 没有⼩⽩⿏死亡,剩下9只⼩⽩⿏和1瓶毒药⽔
3.19、⽼王30元买回来的玩具,40元卖。顾客⽤100元买,⽼王没钱给顾客,向邻居借100元,给顾客,后邻居发现100元是,⽼王赔给邻居,问⽼王亏了多少钱(B)。 A. 80 B. 100 C. 忘记了 D. 忘记了 解析: 以我的理解是:⽼王本可以赚那40元的,但因为假钱缘故,还赔60元进去,所以共亏了100元。 不知道对不对
⼆、编程题(共3道)1、排序题 输⼊: [9,7,8,5] 输出: [5,7,8,9]
分析:实现并不难,给出的代码是:
vector<int> sortFunc(vector<int>& source){
return source;
}
直接使⽤algorithm中的sort对source中元素排序即可。
1#include<iostream>
2#include<vector>
3#include<algorithm>
4using namespace std;
5
6vector<int> sortFunc(vector<int>& source) {
7
8 sort(source.begin(), d());
9 return source;
10
11}
12
13int main() {
14
15 vector<int>vBefore;
16 vBefore.push_back(9);
17 vBefore.push_back(7);
18 vBefore.push_back(8);
19 vBefore.push_back(5);
20 vector<int>vAfter;
21 vAfter = sortFunc(vBefore);
22 for (int i = 0; i < vAfter.size(); i++) {
23 cout << vAfter[i] << endl;
24 }
25
26 return 0;
27
28}
2、求矩阵的转置 输⼊: 3 1 2 3 4 5 6 7 8 9 输出: 1 4 7 2 5 8 3 6 9 分析: 这道题的实现并不难,主要是我⾃⼰不会创建动态的⼆维数组,⽽且不懂vector容器嵌套vector容器还硬着使⽤。 这⾥有学过矩阵转
置都很容易实现,主要是动态⼆维数组的创建可能会有点难。
1 //动态⼆维数组的建⽴
2 int size;
3 cin >> size;
4 int** arr = new int* [size];
5 for (int i = 0; i < size; i++) {
6 arr[i] = new int[size];
7 }
完整代码:
1#include<iostream>
2using namespace std;
3
4int main() {
5 //动态⼆维数组的建⽴
6 int size;
7 cin >> size;
8 int** arr = new int* [size];
9 for (int i = 0; i < size; i++) {
10 arr[i] = new int[size];
11 }
12 //接收数组数据
13 int temp1, temp2;
14 int i = 0, j = 0;
15 while (cin >> temp1) {
16 arr[i][j] = temp1;
17 j++;
18 if (() == '\n') {
19 i += 1;
20 j = 0;
21 }
22 // 转置并输出结果
23 if (i == size) {
24 i = 0, j = 0;
25 for (int i = 0; i < size; i++) {
26 for (int j = i; j < size; j++) {
27 if (i != j) {
28 temp2 = arr[i][j];
29 arr[i][j] = arr[j][i];
30 arr[j][i] = temp2;
31 }
32 }
33 }
34 for (int i = 0; i < size; i++) {
35 for (int j = 0; j < size; j++) {
36 cout << arr[i][j] << " ";
37 }
38 cout << endl;
39 }
40 }
41 }
42
43 return 0;
44}
3、求矩阵的转置 输⼊: [[1,2,3],[4,5,6]] 输出: [[1,4],[2,5],[3,6]] 分析:第三题仍然是求矩阵的转置,只不过这⾥多了个[]作为⼲扰。 思路: 读取有四种情况: 当读到'['时,⼊栈 当读到'数字'时,⼊队 当读到']'时,匹配'[' 当读到','时,
跳过
1#include<iostream>
2#include<string>
3#include<stack>
4#include<queue>
5using namespace std;
6
7int main() {
8 stack<char> s;//⽤于统计有⾏数
9 queue<int> q;
10 int row = 0, cow;
11 string str;
12 cin >> str;
13 string::iterator it = str.begin();
14 while (it != d()) {//注意这⾥是it != d()
15 //四种情况:
16 // 当读到'['时,⼊栈
17 // 当读到'数字'时,⼊队
18 // 当读到']'时,匹配'['
19 // 当读到','时,跳过
20 if (*it == '[') {
21 s.push(*it);
22 }
23 else if (*it == ']') {
24 if (s.top() == '[') {
25 row++;
26 s.pop();
27 }
28 }
29 else if (*it == ',') {
30 it++;
31 continue;
32 }
33 else {
34 q.push((int)(*it - '0'));// 转成整形
35 }
36 it++;
37
38 }
39 //创建转置后的⼆维数组
40 row--;//因为加多⼀⾏,所以要减去1
41 cow = q.size() / row;
42 int** arr = new int* [cow];
43 for (int i = 0; i < cow; i++) {//注意这⾥是cow不是row
44 arr[i] = new int[row];
45 }
46 //求矩阵的转置
47 for (int i = 0; i < row; i++) {//注意这⾥不要反了是row,下⾯是cow
48 for (int j = 0; j < cow; j++) {
49 arr[j][i] = q.front();
50 q.pop();
51 }
52 }
53 // 输出结果
54 cout << '[';
55 for (int i = 0; i < cow; i++) {
56 cout << '[';
57 for (int j = 0; j < row; j++) {
58 cout << arr[i][j];
59 if (j != row - 1)cout << ',';游戏开发工程师需要学什么
60 }
61 cout << ']';
62 if (i != cow - 1)cout << ',';
63 }
64 cout << ']' << endl;
65
66 return 0;
67}
结尾处说说⾃⼰的感受吧。将发题⽬出来不是为了什么,只是希望那些跟我有同样梦想的(做游戏)伙伴感受⼀下游戏公司的笔试题⽬难度如何,希望你们能顺利通过笔试,拿到⾃⼰期望的office。上⾯的解题思路有的是其他⼈的想法,有的是博主⾃⼰的想法。如果有⽐较厉害的伙伴想到更好的⽅法可以留下您的解题思路,⼤家⼀起交流交流。另外,博主有打算⾃⼰做游戏的想法,⽬前是想做⼀款avg类型的游戏(要上架的),剧情ing,志同道合的伙伴可以了解⼀下。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论