笔试题:
一、简答题30分
1. extern”C”{}的作用和应用场景;
2.写出两者你熟悉的设计模式,及应用场景,可以给出伪代码;
3.TCP中time_wait是表示那种状态,及应用场景,以及起好处和坏处;
二、算法题40分
1. 有一个任务执行机,任务数N<1000,该机器每次只能执行一个任务,而任务之间存在依赖关系,
但是任务之间没有循环依赖,请给出适当的任务执行顺序。算法、伪代码,并分析其时间复杂度和
空间复杂度。
2. 编写函数,统计在某段英文文本中完整句子的数目,文本中只包括大小写字母,空格,点好(.),逗号(,)。
完整的句子必须包含至少一个字母并以点号,结束。
要求:完整的代码,达到目标;高效;简洁;
三、系统架构30分
有一个监控系统,有大量的数据记录包括{url,用户访问ip,时间},要对这个监控系统进行维护,并提供查询。
设计一个能存储和维护1000亿条记录,实时监控,并支持一下两种查询:
1. 指定任意一个时间段(精确到分钟)和某个url,查处这个时间段内的所有url的访问总量。
2. 指定任意一个时间段(精确到分钟)和某个ip,查询这个时间段内的ip访问总量。
1.很多地方都见到这道题,extern “c”是指将该段代码以C语言形式进行编译、链接。由于C不支持函数重载,C与C++对于同一函数进行编译后在符号表中保存的函数名存在差异,故当进行C、C++混编时会出现一些问题。
2.记得上学期还特意去借了一本《设计模式》书来看,翻是翻了几下,结果啥也没记住,这题直接空了。对于设计模式记得最深的一句就是“过分在意设计模式会阻碍你的创新思维”。
3.前段时间腾讯笔试时有道选择题也是考TCP的几个状态,当时做错了。回来后看了下TCP的连接和释放,这次还真用上了。time_wait是TCP释放四次握手中的一个状态,当第三次握手完成时,即客户端收到来自服务器的FIN后,再发送一个ACK,客户便开始了time_wait状态。
同时一个记时器开始记时,当达到2倍一个报文段在因特网中最大的生存期时代表超时。如果在超时前客户端再次收到FIN,则表示是服务器重发的FIN,客户端需重发送ACK。
4.依题目得知是求有向图的一个拓扑序列。
5.直接扫描一遍。
- int count_prefect_sentence(string str)
- {
- int i = 0, cnt = 0, hasOneLetter = 0;
- while(str[i])
- {
- if(str[i] == '.')
- {
- if(hasOneLetter)
- cnt++;
- hasOneLetter = 0;
- }
- else if(isalpha(str[i]))
- hasOneLetter = 1;
- i++;
- }
- return cnt;
- }
6.海量数据处理题,当时花了很长时间在想这两题,感觉没有想到什么好的思路。这样的系统应当是实时性优先吧,在时间空间上首先考虑时间。
a、建个二维映射Map[time].bitset/, time代表某一时间点,将时间点表示为
时间秒差数字作为映射索引。第二维考虑bitset的方式, 建立一个2^32(整型的最大位数)的数组(bitset),每一个bit位0或1代表该位上代表的IP整数是否访问过. 统计时枚举每个时间点,再按位和indexIP进行与运算进行统计,时间效率应该不差。以保存30天为例,空间为(30*24*3600)*(2^32)bit = 2^50B = 1000TB = 1PB
b、时间以分钟为单位,第二维直接为IP, 映射值为该分钟访问量。(30*24*60)*(2^32)B= 2^50B = 1000TB = 1PB
7、映射Map[url][time],将url进行字符串hash,再进行枚举统计。
这两题如果做成两维映射,内存吃不消,既然两题中的一维是已经指定的,变化的只是时间段,因此可以用一维表示,先预处理,再进行统计。
面试一
1.自我介绍;结合自己的简历简单地介绍一下。
2.项目介绍;结合自己做主要的项目,以及带的项目介绍资料,互动式地讲解;面试官关系的是机器学习相关的问题。
3.算法题;二叉树的非递归实现前序遍历;
4. 算法设计题;如何去掉重复页面;
面试二
1. 自我介绍;(同上)
2. 项目介绍;(同上)
3. 算法题;(略)问到了一个TTest;
4. 算法设计题;如何对Query进行分类;
面试三
1. 自我介绍;
2. 项目介绍;
3. 算法题两道;
1>一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
2>从1到1亿,所有出现的数字的和(125=1+2+5),手工计算机出来;