毕业两年时的面试经历,再次看觉得有点意思,经过这次面试,我对自己的水平更加清楚了,可以说算法一般,C++、理论还勉强过得去,充其量是刚入行的程序员。
华为面试:
1.实现列举满足以下条件的所有三位数,条件一:是完全平方数,二是有任何两个数字相同如144等.我七分钟左右写出.
2.请使用api写出客户端和服务器连接的过程.
3.说说select函数,socket函数族.
4.请说出你使用http时,http调用函数流程.当我说到readopenfile时,他问到是不是异步的.
5.linux常用命令及网络函数.
6.群体面试PK对方.
深圳易思博面试:
1.请用shell命令 来读取文件为12 34 56的数据,并且输出为56 34 12.
2.有两个有序数组,请把它们组成一个有序数组.
3.重载操作符,请问+号操作符你为什么不返回引用?可以返回引用吗?
4.struct中的段移位问题.
5.说说你用过的设计模式,并举例.
6.请说明C++中的多态性,并详解虚函数机理.
7.用KMP算法写出查找字符串.
8.linux的常用命令.
中青宝面试:
1.写出求素数的算法并且分析效率.
2.写出求两个数的最大公约数.
3.写出windows下文件和目录的设计模式.(组合模式)
4.还有一些没意义的语文知识题目.
5.用OO描述狼吃羊羊吃草.
腾讯电话面试:
1.请说出http协议的优缺点.
2.请说出TCP/IP三次握手原理及其状态转换过程.
3.请说说epoll/poll/select的原理及使用逻辑.
4.详细说说滑动窗口.
5.请说出你所做项目的完成端口模型.
6.用英语说说你最近的项目,介绍自己.
7.linux的五种IO模式/异步模式.
我的失败:对一些原理性的东西都没仔细研究,导致无法正确回答.找了linux网络编程类工作,其实我根本没做过linux网络编程的项目,我最擅长的VC开发甚至一句都没问没有发挥的机会.发觉大公司比较重视底层的理解.这两天主攻linux编程的一些函数接口.我的C/C++基本上没有留下什么漏洞,只是领域知识理解不深,都怪自己不好学不深入研究.
迅雷面试分为五面,笔试+技术一面+技术二面+hr面试+…,个人感觉迅雷的技术是不错的学习指导,难度也蛮大的,从STL到MFC,从数据结构到算法等都问得比较细比较底层,顺便说说那面试官是武汉大学毕业的,很强悍,比我还年轻,由衷佩服他对原理的深度了解……
迅雷技术一面(约四十五分钟):
一:STL部分
-1.上机考试.我做的题目是读取某个文件中的每行数据,每行数据是一种特殊格式的url地址,让我分别解析各个域的值,然后再写入另一个文件中,并且要对齐完整.两个小时内解答完毕.自我感觉还挺好的,他看了一下我自己创建的测试用例和目标文件,然后叫我说一些具体的解析算法.还好我在函数头很详细的描述了算法实现步骤.要不然紧张的时候肯定讲不好,那就吃亏了.看来习惯写注释是好事啊.我的编程规范应该没问题,他阅读了一下代码就说道我们是搞服务器的,服务器是不能用CString的.你为什么不用string.我没解释什么?我哪敢解释啊?只说其实平常我用string也很多.(内心的小九九:其实两个小时要完成这题目,写代码速度要快,而且还要找最方便的途径.我用CString是因为MFC里面有读取每行的函数ReadString,如果用string要么要CString转换为string,要么读取文件时使用read然后自己解析获取每行数据,无论哪种都很浪费时间).总之他对我得到的结果还满意.不足之处是使用了CString.然后那个漂亮的人事美眉就带我去吃饭,叫我吃完饭再下一轮面试.
0.拿笔试题目重新问我.主要是问那些我做不好的四道题,一是#include “vector” 和#include <vector>类似题目的延伸(他说那看来这题目你是不仔细选错了).二是什么我忘记了,三是二分查找算法(就是传入参数的时候忘记检测了).二分查找算法面向什么类型的数据?链表可以进行二分查找吗?(我答错了,说不可以)四因为我在排序时用了选择排序和冒泡排序,他就问我什么不用快排,然后解释了一同快排的原理.估计耗费十多分钟.最后他总结说,虽然还有点问题,但是总体还挺好的.
1.allocator如何定位内存,我答不好.
2.说说内存池的原理,我答不好,但因为是服务器开发,所以很重视,技术一面和二面都问到.
3.list是什么链表?单链表还是双向链表或者双向循环链表,何以见得?
4.你对stl熟悉吗?我说可以算熟悉吧.那你看过哪些stl的书籍.说了几本.开始展开攻击.说说STL中的排序算法有哪些?sort的排序算法是什么?现在有一个对象A,A中有一个vector<B>,B中有4个整形变量a,b,c,d.我只想按照a进行排序.使用sort算法如何做?我回答是定制自己的函数对象或者回调函数,然后传入回调函数.面试官继续说到可是我又不想使用函数对象和回调函数,我怎么实现呢?我想了十秒钟,搜索不到任何信息只好回答说不知道.他写出了bind2rd这个函数,然后解释了一下.默认情况下sort使用什么规则进行排序?我回答是less函数对象进行排序.函数对象和回调函数有什么区别?各有什么优缺点,编程时你倾向于用哪种?我答曰倾向于用函数对象,因为函数对象作为函数的对象,他有着更大的优势,特别是与stl衔接比较好,函数对象是C++程序员取代回调函数的方式.但是在C编程中就用函数指针了.map主要目的是什么?内部数据结构是什么?我答曰红黑树.那红黑树的时间复杂度是多少?map为什么要使用红黑树作为其数据结构.说说vector的存储机制.说说list的存储机制?什么情况下用vector什么情况下用list.
5.编程理论类:请说出栈和堆的区别?什么时候下用栈什么时候下用堆?什么情况下变量的空间会在栈什么情况下会在堆?一般情况下你用哪种.还有几个知识点,忘记了.
6.算法类:说说快排吧?我一一说出了快排的实现原理.快排有哪些优缺点?我说到当数据有序时,快排时间复杂度为0(N2),甚至低于一般排序算法.说说如何规避这种情况,我说道内置一个变量来判断是否有序,如果有序则不再排序,也可以避免大量递归导致栈空间不足.后面他解释说可以用随机生成基准值来规避这种情况.现在我有一个整形数组,该数组有正负,请找出结果最大的一段数组?实现斐波那契函数.我知道肯定不能使用递归.后面这题目他解释说,其实你不要想那么复杂,我们可以使用空间换时间.说着他就画出一个数组的图形.说说你写过比较满意的算法?
7.C/C++:你觉得你C++学得如何?我笑道还行吧.说说多态性.我说:当父类声明了虚函数fun时,子类继承时,该fun就有了多态性.当声明对象时,编译器默认会把虚函数表插入函数对象头或者尾(不同的编译器有不同的处理方式).当对象调用fun时,系统会找到fun函数的真正地址进行路由.他问道:你觉得fun函数地址是在编译时还是运行时插入虚函数表的?我说应该是运行时,因为多态性是在运行时插入.他笑道我猜想他也不懂.这个问题可以回去再思考.请说说#include “vector” 和#include <vector>的区别?请问这种差别体现在编译时还是运行时?回答当然是编译时了,因为此时还没生成目标文件.请说说文件头依赖?答曰,文件头依赖就是头文件之间的相互包含.怎么减少这种文件头依赖?答曰,类的前向声明.请说说系统为你生成的默认函数有哪些,什么时候生成?请说说浅拷贝和深拷贝,什么时候需要定制自己的拷贝构造函数.你的C水平如何?我笑道这个难说,我也不知道怎么说应该还行吧,他笑道你简历写精通.我要找容器里面的某个变量A,你怎么做?我答道用循环遍历就可以了.他说道,你看过effective C++没有,那里很明确的说道尽量不要用循环?后面他说道可以用stl中的agolrithm中的find.我纳闷说find也是用循环啊?他固执己见.后面他说道其实我就想考你用没用过这个函数.
8.其实我MFC用得最多,对方却丝毫不问我MFC的东西,又失去一大优势.
总结:技术一面我的算法/内存池/allocator答得不好/stl源码级别的也答得不好,算法一直是我的薄弱环节,毕竟工作中没有用过那种算法,项目紧的时候静不下心来看.主要还是个人吧.
迅雷技术二面(约二十五分钟):
一面结束后,那兄弟叫我稍等一下还有人来面试.来的新面试官不苟言笑,面试了二十分钟,没见过他笑,还好我见过世面也不当回事.
1.项目经验:我主要找了两个大项目来说(我的项目都是基于MFC的,我估计他们不怎么懂MFC,也没问我MFC的东西,只抽出那些理论来问,也怪我没深究.).
2.linux,主要是问一些进程,常用命令子类的.
3.请说出TCP/IP中客户端和服务器如何连接的.说说连接时状态机怎么转换,关闭时状态机又怎么转换.我只说出三次握手的原理,状态机转换的东西我直接说我不知道.(TCP/IP还没看那么深)
4.说说你看过哪些书,我说了几本(设计模式/C++primer/effective C++/more Effective c++/C++ template/STL源码剖析/深度探索对象模型等,我傻了竟然只讲C++的书而已,干嘛不把那些算法书也说进去),请说出你用过的设计模式,我答曰我已经用C++实现了标准的23个设计模式,他说,我想知道的是你在项目实践中用过哪些设计模式.我胡乱答了几个(其实就用过两个,一般的小项目很少用设计模式吧).主要还是问了内存池问题,他逐一点拨我知道重载new 和delete运算符,然后用链表把这些内存块连接起来,如果使用过的内存,则标识,delete时把其设置FALSE就行(以前好像见过内存池的文章,只是没用到也就不关心,看来以后得多注意细节了,别人不是看你懂哪个API而是要你懂API的具体细节).
5.因为我提到项目中用到了http协议,他就问了一些http协议的知识.我答得不好,对http协议我只停留在用的阶段.
6.问了map采用什么数据结构,list是什么链表,与一面一样.哈希表的时间复杂度,为什么要使用哈希表,哈希表有什么缺点,冲突检测机制怎么实现.前面答得还好,可是我忘记了冲突机制的算法了,只好说,我忘记了.
7.完成端口模型/异步通信等/socket.
总结:问的都是原理性,可惜做项目的时候很少深究原理,现在知道吃亏了.迅雷面试问的知识点那么多,疲于赶项目的程序员们你做好准备了吗?细节做起,不放过任何原理性的东西才是好程序员的习惯.此时开始,关注细节原理.
我的失败:对一些原理性的东西都没仔细研究,导致无法正确回答.找了linux网络编程类工作,其实我根本没做过linux网络编程的项目,我最擅长的VC开发甚至一句都没问没有发挥的机会.发觉大公司比较重视底层的理解.这两天主攻linux编程的一些函数接口.我的C/C++基本上没有留下什么漏洞,只是领域知识理解不深,都怪自己不好学不深入研究。