这是陈硕在知乎给出的几个问题(针对校招)
- 标准库各容器的基本操作的复杂度。标准库算法的复杂度,例如 std::sort() 的平均复杂度、最坏复杂度(答 O(N^2) 和 O(N log N) 都算对),最坏情况什么时候出现。
- 标准库各容器(deque 除外)的数据结构(标准党勿喷,主流 STL 实现的数据结构都差不多),以及 vector 的容量增长方式。如果回答得特别好,还可以补充问为什么 vector::push_back() 的复杂度是分摊之后的 O(1),作为加分。
- 出一道使用 lower_bound / upper_bound 能轻松解决的简单算法题;或者实现 set_intersection() 或 set_union() 或 merge();或者实现 word count,统计每个单词出现的次数(最多十几行代码),如果有时间,输出时再按出现次数排序。
我一般会循序渐进的问问题,以C++的虚函数为例。
如果中间被求职者带跑了,比如问第一题的时候扯到模板元编程了,我的态度就是随着他跑,在他自己最擅长的领域才能看出他的思路究竟是怎样的。
总之,尽量通过方方面面探知求职人员对技术核心思想的把握能力,如果在面试之前他就考虑的很透彻,这是上上之选(原因是其会自己沿着正确的方向独立思考),如果在面试中可以现场考虑出大概,这是上之选(原因是其逻辑思维还不错)。
思维方式很重要,某种程度上,这东西决定一个人的命运。
- 了解多态么?它是怎么实现的?什么时候应该使用它?
- 在语言层面,虚函数是怎样实现的?为什么还要区分虚函数和普通函数,都成虚函数不好么?
- 虚表里存储的是什么?
- 如果基类定义先声明了f函数后声明了g函数,子类定义会反过来(真正面试的时候会有样例代码给出),那么虚表里第一项是什么?
- 如果有多继承,虚表内会怎样?
- 等等。。。
- 第一题,如果提到静态多态,并且简单询问后确认懂得什么是静态多态,则有额外加分。
- 第二题,提到和其他语言的对比(如java oc python 等),有额外加分。
- 第四题,关键不在于答案,而在于回答的思路。如果在回答出大体原理之后加以说明这东西是undefined,不应该依赖于这个结果,有额外加分。
- 第五题,如果一开始求职者不太了解这个事情,但是通过我简单的提示,能够沿着这个思路走下去,无论对错,均有额外加分。
如果中间被求职者带跑了,比如问第一题的时候扯到模板元编程了,我的态度就是随着他跑,在他自己最擅长的领域才能看出他的思路究竟是怎样的。
总之,尽量通过方方面面探知求职人员对技术核心思想的把握能力,如果在面试之前他就考虑的很透彻,这是上上之选(原因是其会自己沿着正确的方向独立思考),如果在面试中可以现场考虑出大概,这是上之选(原因是其逻辑思维还不错)。
思维方式很重要,某种程度上,这东西决定一个人的命运。
下次有空自己整理一些:
老套路,先挖坑再填。