苦逼三流小公司程序员这半年找工作经历(2)面试题目
换工作的事儿终于搞定了,断断续续找了半年时间,曾经有段时间感到特别低迷,连续被各种各样的理由拒掉,最变态的就是说智力测验没过,让我好郁闷了一阵。那种被打击到开始怀疑自己的感觉实在是不好。 待到11月底12月初的时候,好像一下子峰回路转了。好消息
换工作的事儿终于搞定了,断断续续找了半年时间,曾经有段时间感到特别低迷,连续被各种各样的理由拒掉,最变态的就是说智力测验没过,让我好郁闷了一阵。那种被打击到开始怀疑自己的感觉实在是不好。
待到11月底12月初的时候,好像一下子峰回路转了。好消息接踵而至,一口气拿了4个offer,包括一家国企,一家美资企业,两家纳斯达克上市的国内企业的offer,顿时有山高月小水落石出的感觉。接着就是发愁怎么拒offer了,最先pass了国企和美资企业,感觉这两家太安逸,没有什么挑战,而且名气不大。已经受够了被问到:“在哪里工作”时解释半天的尴尬,发誓一定要找个响当当的东家。最终选择了一家和自己背景相关、但薪资稍低一些的工资,还是更看重发展吧。
顺便说一句,算了一下这两个月总共面试了17个单位,最终确认给发offer的是4个,成功比例1:4,供大家做个参考吧。
啰嗦了这么多,下面开始总结在这些公司面试遇到的题目,供明年初想换工作的兄弟们做个参考,这些题目说白了都不是很难,但是想做到让面试官满意还是有点难度的。基础知识的部分仔细看看书可以应对,在白板上或者纸上回答面试官现场考察的题目就很考验心理素质和编程功力了。
当然,如果细心准备一下,还是非常有帮助的。
1,C++基础知识的面试题:
1、static, const 的用法:在类中使用static成员函数,为什么static函数不可调用non-static成员变量和成员函数?(没有this 指针),const成员函数如何使用?为什么const成员函数不可修改成员变量?(const this指针)
2、虚函数:纯虚函数的用法,多态如何实现,虚函数表如何实现?虚析构函数的作用
3、auto_ptr,shared_ptr的用法? (一家很牛的互联网公司电话面试的时候问的,仅此一次)
4、类型转换,static_cast, dynamic_cast, reinterpreter_cast, const_cast的用法
5、overide, overload,为什么构造函数不能为虚函数?
6、stdcall, cdecl的区别?
还有那家纯美资企业的C++面试题,问题比较偏门,包括类成员指针、参数为对象时临时对象,模板偏特化等,建议看看《effective c++》,另外还有本英文的《C++ common knowledge》,也是本很有用的书。牛逼点的还可以看看《深入探索C++对象模型》这本书,不过本人感觉这书里讨论的情形太过奇葩,又是多态又是多重继承又是模板的堆在一起,基本上在工程实践上用到的情况很少。除非你想发明一种新语言。
2,数据结构与算法
这部分是整个面试过程中最有难度的部分,往往也是决定能否给offer的决定环节。准备数据结构与算法的最佳参考书当然是《算法导论》这本公认的经典,这本书的特点是非常非常的系统,但是有些数学证明,对于面试而言是无帮助的。面试中最多问一句:空间复杂度是多少?时间复杂度是多少?
另外有一本很有用的书《算法技术手册》,里面有很多经典算法的原理图和伪代码,比起《算法导论》,这本书要实用和高效很多。
面试中经常考察的数据结构包括链表、数组(字符串)、二叉树,太复杂的数据结构一般较少问到,唯一例外的是被问到了最大堆和最小堆。
具体的,
链表:翻转一个单向链表(递归与非递归),合并两个排序的单向链表为一个排序链表(merge sort),找出两个链表相交的第一个节点
字符串:1,在A串中找到B串,并返回位置。 2,找出字符串数组中出现一次的一个单词,出现一次的两个单词?3,写一个atoi程序(见本人博文)4,写一个strcpy,注意内存申请失败的时候异常处理。
二叉树:找出二叉树的第二大(小)节点
其他:用两个stack实现一个queue
算法中比较重要的是几个常用的排序算法,及其变形应用,包括insert sort, merge sort, quick sort(变形包括求最大的N个数), count sort。写一个没有错误的二分搜索(递归非递归)
白板或者纸上现场作答的题目主要是为了考察你的编程基本功,一般不会有太复杂的算法,但是并不表示你能很容易的通过,越是简单问题,面试官对程序的书写风格、边界检查都会考察的非常仔细(如aoti程序)。当然也有例外,有一次让我在白板上写优先队列的pop操作,由于涉及到优先队列的堆重建,和优先队列用数组的表示方法,一下子就蒙了,面试官又一副冷漠的神情,让我有些愤怒,很想跟他说我真的记不得了要不你来写一下看看?那是我最不愉快的一次面试。
3,操作系统
Windows操作系统通常会问
1,线程和进程的区别,线程的同步方式?进程间的通信方式。 2,Windows消息传递机制? 3,异步socket,连接池
Linux
1,常用命令,top,ps
2, \proc\*目录
3,压缩打包命令
4,C语言调试方式,内存泄露检查工作
5,httpd里的mod的编写?如何优化http消息?
4,杂项
1,性能优化问题,C10K
另外面试官一般会根据你的项目经历,问一些项目相关的问题,比如会问你:你做过的项目里你最得意的作品是什么?最不满意的地方又是什么?又比如我简历里谈到比较熟悉设计模式,面试官会问你用过哪些设计模式?列出常见的设计模式?所以其实精心准备一份让你有话可说的简历,其实也是非常重要的。
基本上能回忆起来的就是这些。
最后想吐槽一下面试官。其实笔者在决定换工作前也做过面试官的工作,所以对面试官的心态还是比较了解的。大公司的面试官,一方面应聘者如云,另一方面手头的工作繁多,还被HR拉过来,打断手头工作面人,有时候难免有些情绪。这时就可能出现上文我提到的那种情况,弄一个比较偏门的算法题(比如让你写红黑树的增删查如何实现),不给任何提示,然后埋头敲键盘或者看简历,留下应聘者在那里绞尽脑汁。老实说我很鄙视,很简单的道理,对于一个工作几年的程序员,我根本没有时间去把这么复杂的程序每一行准确无误的记在心里,而且我清楚的明白其实你也不能,调换一下角色,我一样可以这样为难你,如果我进来了以后我们就是co-worker,你觉得这样真的有必要吗?而且你还代表着所在公司的形象。我想谁也不想在一个如此教条式的公司工作吧。
所以下次我决定之间给这样的面试官三个字:不记得!当然我可以跟你探讨一下红黑树的原理,为什么要采用这样的平衡结构?不然会有什么极端情况?这种情况下的时间复杂度是多少?
说到这里想赞一下MS的面试官,很多人说MS现在在走下坡路,说有能力的人都愿意从MS出来去做互联网,但是从我面试的经历来看,MS的工程师团队还是非常nice而且高素质。比如有些技巧性很强的问题,你一时没有思路,他会给你提示,然后不断的探讨,启发你的思路,让你得到N个方法,比较时间和空间复杂度,最终得到一个最优答案。我认为这才是比较负责任的面试官应该有的素质。