米哈游--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%,不太清楚为什么,代码较长就不贴了,感兴趣的可以到我的仓库去看,欢迎指教。代码链接