您的位置:首页 > 职场人生

腾讯实习面试总结

2015-05-23 13:20 453 查看
研究生第一次与面试官面对面的“面”试,也是迄今为止与offer离得最近的一次面试。可惜最后还是跪在了二面,败在了细节和基础。二面基本一直在写算法,算法比较基础,但又侧面考察编程逻辑思维的严密性,memmove函数的实现,主逻辑并不复杂,主要考察对特殊情况的处理。由于没有面试经验,每次写完程序很少检查就直接拿个面试官看,导致程序有很多低级错误。

一面:

一、项目相关

项目介绍,面试必考。考察方式类似。

1. 在简历上列举的项目中挑选一个收获最大的项目,手绘项目的模块图,通过模块图介绍整个项目。

2. 项目中使用的关键技术,针对提到的关键技术,展开提问问题。

3. 遇到的最大难题,解决的方法。

二、Linux相关的基础知识

1.进程间通信的方式都有哪些?什么时候选用哪种通信方式?
http://blog.sina.com.cn/s/blog_6002b97001013wec.html
2.两个进程通过共享内存通信,可否将进程1某个变量的指针的地址存入共享内存,然后进程2读取共享内存的中的指针,通过该指针访问进程1种的变量?

待编辑

3.IO复用中select函数,poll函数和epoll函数的区别。
http://www.cnblogs.com/Anker/p/3265058.html
三、代码实现

实现memmove函数
http://blog.csdn.net/hgj125073/article/details/8468746
二面:

一直在写代码……至今还清晰的记得那个清秀的面试官轻轻的说了一句:“多说无益,我们直接开始写代码吧!”于是一个半小时过去了……

多说无益直接上题!

1.在1000亿零一个int型数字选出其中位数(思路题)。
http://blog.sina.com.cn/s/blog_4a8aac970100093j.html
2.判断一个集合是不是另一个集合的子集,集合为int型整数集合

设较长的集合为S1,长度为m;较短的集合为S2,长度为n。

第一种方法,将两个集合排序,然后依次查询S2集合是否在S1中,若均在则S2是S1的子集否则不是。

由于S1,S2均已排序所以只需要遍历S1一遍就可以得出结论,算法复杂度为O(nlogn+mlogm);

第二种方法,使用hash表,先将S1遍历并映射到hash表中,然后遍历S2,判断其元素是否已在hash表中,若均不再则S2是S1的 子集否则不是。

可以使用hashmap,查询效率约为O(1),总体算法复杂度约为O(m+n);

3.实现大数加法
http://www.cnblogs.com/zhangchaoyang/articles/2727225.html
常见的算法是将大数当做字符处理,如7834927598432759827当做字符串“7834927598432759827”,一个数字占一个字节,然而一个字节可以表示0-255,我们只需要表示0-9所以只需要4bit(char c:4)就可以,这样可以更节省空间。

4.因为一面的memmove写的有问题,二面又实现了一遍memmove

答案同上面memmove函数实现。

写算法的时候涉及到了new/delete,面试官问了一个C++底层的问题,在new一个数组时,为什么delete在释放内存的时候只需要指出释放空间的起始位置而不用显示的指出数组的大小?

当时只知道new函数申请堆空间时,数组的大小应该已经存储下来,但不知道存在哪了。后来回来在网上查了一下,原来使用new函数申请堆空间的时候,会额外申请四个字节的空间用来保存申请数组的长度。关于new和delete更详尽的说明可以参考博客http://blog.csdn.net/nodeathphoenix/article/details/39693865。

除了以上算法题外,面试官让我翻译了一段英文文档。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: