广州乐享元游-校招-C++服务端开发工程师笔试

广州乐享元游-校招-C++服务端开发工程师笔试,第1张

广州乐享元游-校招-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                      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 sortFunc(vector& source){

                        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() {

	vectorvBefore;
	vBefore.push_back(9);
	vBefore.push_back(7);
	vBefore.push_back(8);
	vBefore.push_back(5);
	vectorvAfter;
	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];
	}

完整代码:

#include
using 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,志同道合的伙伴可以了解一下。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5658139.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存