一、选择题(共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
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
return source;
}
直接使用algorithm中的sort对source中元素排序即可(sort(source.bengin(), source.end())。
#include#include #include using namespace std; vector sortFunc(vector & source) { sort(source.begin(), source.end()); return source; } int main() { vector vBefore; vBefore.push_back(9); vBefore.push_back(7); vBefore.push_back(8); vBefore.push_back(5); vector vAfter; vAfter = sortFunc(vBefore); for (int i = 0; i < vAfter.size(); i++) { cout << vAfter[i] << endl; } return 0; }
2、求矩阵的转置
输入:
3
1 2 3
4 5 6
7 8 9
输出:
1 4 7
2 5 8
3 6 9
分析:
这道题的实现并不难,主要是我自己不会创建动态的二维数组,而且不懂vector容器嵌套vector容器还硬着使用。
这里有学过矩阵转置都很容易实现,主要是动态二维数组的创建可能会有点难。
//动态二维数组的建立 int size; cin >> size; int** arr = new int* [size]; for (int i = 0; i < size; i++) { arr[i] = new int[size]; }
完整代码:
#includeusing namespace std; int main() { //动态二维数组的建立 int size; cin >> size; int** arr = new int* [size]; for (int i = 0; i < size; i++) { arr[i] = new int[size]; } //接收数组数据 int temp1, temp2; int i = 0, j = 0; while (cin >> temp1) { arr[i][j] = temp1; j++; if (cin.get() == 'n') { i += 1; j = 0; } // 转置并输出结果 if (i == size) { i = 0, j = 0; for (int i = 0; i < size; i++) { for (int j = i; j < size; j++) { if (i != j) { temp2 = arr[i][j]; arr[i][j] = arr[j][i]; arr[j][i] = temp2; } } } for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { cout << arr[i][j] << " "; } cout << endl; } } } return 0; }
3、求矩阵的转置
输入:
[[1,2,3],[4,5,6]]
输出:
[[1,4],[2,5],[3,6]]
分析:第三题仍然是求矩阵的转置,只不过这里多了个[]作为干扰。
思路:
读取有四种情况:
当读到'['时,入栈
当读到'数字'时,入队
当读到']'时,匹配'['
当读到','时,跳过
#include#include #include #include using namespace std; int main() { stack s;//用于统计有行数 queue q; int row = 0, cow; string str; cin >> str; string::iterator it = str.begin(); while (it != str.end()) {//注意这里是it != str.end() //四种情况: // 当读到'['时,入栈 // 当读到'数字'时,入队 // 当读到']'时,匹配'[' // 当读到','时,跳过 if (*it == '[') { s.push(*it); } else if (*it == ']') { if (s.top() == '[') { row++; s.pop(); } } else if (*it == ',') { it++; continue; } else { q.push((int)(*it - '0'));// 转成整形 } it++; } //创建转置后的二维数组 row--;//因为加多一行,所以要减去1 cow = q.size() / row; int** arr = new int* [cow]; for (int i = 0; i < cow; i++) {//注意这里是cow不是row arr[i] = new int[row]; } //求矩阵的转置 for (int i = 0; i < row; i++) {//注意这里不要反了是row,下面是cow for (int j = 0; j < cow; j++) { arr[j][i] = q.front(); q.pop(); } } // 输出结果 cout << '['; for (int i = 0; i < cow; i++) { cout << '['; for (int j = 0; j < row; j++) { cout << arr[i][j]; if (j != row - 1)cout << ','; } cout << ']'; if (i != cow - 1)cout << ','; } cout << ']' << endl; return 0; }
结尾处说说自己的感受吧。将发题目出来不是为了什么,只是希望那些跟我有同样梦想的(做游戏)伙伴感受一下游戏公司的笔试题目难度如何,希望你们能顺利通过笔试,拿到自己期望的office。上面的解题思路有的是其他人的想法,有的是博主自己的想法。如果有比较厉害的伙伴想到更好的方法可以留下您的解题思路,大家一起交流交流。另外,博主有打算自己做游戏的想法,目前是想做一款avg类型的游戏(要上架的),剧情ing,志同道合的伙伴可以了解一下。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)