米哈游--2020春招实习

笔试

米哈游是我前阵子春招补录才投的(应该是有大佬毁约了),之前不会C++所以没敢投,因为是补录所以应该是没有多少hc了,就抱着做套真题不亏的心态投递了,前几天才做完笔试所以印象还比较深刻。

同样是在牛客网笔试,需要录屏 + 手机公众号监控,两个小时,选择填空 + 2道编程 + 附加题(根据你投递的方向选择),编程题可以使用本地IDE。

选择都是不定向选择,各种内容都覆盖到了,感觉还是挺难的。

编程第一题:求同时存在的公告的最大数量

先输入一个n,代表公告的数量,然后循环输入这n个公告的开始时间和结束时间(左闭右开),然后计算公告最多能同时存在几个。比如公告1:[1, 6), 公告2: [2, 7), 则[2, 5]这段时间内有两个公告同时存在,所以输出2。

以下是我的AC代码,我想得比较简单,就是对起始时间数组和结束时间数组排序后,用一个类似扫描线的指针从左到右扫描过去,这个画图比较好理解,由于进行了排序,所以时间复杂度是O(nlogn),借助了两个辅助数组,空间复杂度O(n),应该有更好的解法,不过由于时间原因我没有想。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
	vector<int> start, end;
	int num;
	int max_num = 0;
	cin >> num;
	while (num--)
	{
		int a, b;
		cin >> a >> b;
		start.push_back(a);
		end.push_back(b);
	}
	sort(start.begin(), start.end());
	sort(end.begin(), end.end());
	//从头开始遍历start数组,遇到一个就+1,比较end数组,小于等于则-1,end索引前进,下一个start
	int end_index = 0;
	for (int i = 0; i < start.size(); i++)
	{
		max_num++;
		if (start[i] >= end[end_index])
		{
			end_index++;
			max_num--;
		}
	}
	cout << max_num << endl;
}

编程第二题:解析字符串

输入a-d表示abcd,X-a表示XYZa,a-b2表示abab,a2就是aa,然后给你一串字符串比如a-d2ac2a2X-z,让你输出出现频率最高的字母,不区分大小写,A和a算同一个,然后如果频率相同,优先输出字母小的,考察的是有限状态自动机和ASCII码,剑指offer面试题20很类似,但因为本题涉及了ASCII码的操作,较为繁琐一点。

我是用了C++的map来存储每个字母对应出现次数,然后针对不同的序列组合情况写了三个解析函数(后面发现可以通过默认参数缩减为两个)

这题本是一道不难的题,只是代码较多,细节较多,导致我debug的时间过长,后面的附加题也来不及做了。最后也只过了40%,不太清楚为什么,代码较长就不贴了,感兴趣的可以到我的仓库去看,欢迎指教。代码链接

posted @ 2020-06-16 16:50  烧饼VisionWong  阅读(819)  评论(0编辑  收藏  举报