我是在校招的时候参加了今日头条的招聘,岗位是C++,最后成功拿到了入场券。但是这也丝毫不值得骄傲。
大家都知道:技术日新月异,要是几个月不更新自己的技术栈,就会被时代淘汰。简单点说,我那个在学习scratch编程的小学生弟弟,都会关注MIT LKG团队是否更新版本,3.0来了,那么2.0对不起了,转手抛弃。
?
(更何况大佬那么多,我不过是个才入门的小弱鸡~)
?
以下是我总结进入头条的两大决定性因素:
一是,刷面经和笔试题非常关键。你将会在搜集资料的过程中了解到头条系的状况,具体岗位所面临的问题和笔面试的风格特征,做到有备无患。
二是,面试官会更偏爱逻辑思维强的人,在网上就有这样一个例子:
class="img-wrap" style="display: block; text-align: center;">
且不说这个故事真实性如何,其中头条系的风格是被体现得淋漓尽致。毕竟理工男是真的多,在工作中,会特别讲究逻辑思维。没有逻辑的人,是混不下去。
最后给大家分享一下我的面试过程,希望能给大家一些参考。
?
(题目顺序有些不分先后,但大致有序)
?
第一面(50 min)
1、进程和线程的区别和其使用等
常规题。
2、tcp和udp的区别
常规题。
3、http协议和https协议的不同和其大概原理
还好前几天看了一篇HTTPS的科普,我就讲了一下https的加密方法,和公钥私钥的使用。
4、三次握手和四次挥手的过程和为何如此设计的原因
TCP连接是双工的,围绕这一点说了很多。
5、linux了解嘛?说一下基础命令,做过linux的相关开发吗?
不了解,基本命令也不会,很尴尬。
6、智能指针了解吗?说一下
说了shared_ptr和auto_ptr这些,讲了一下它们的表现效果和使用时机,还有可能造成的错误。
7、写一下中序遍历的非递归写法
其实以前没实现过非递归的,在纸上画了一下,想到用栈,然后两分钟写好就直接过了
8、几个sizeof的题,就是int* a=malloc(10),cout<<sizeof(a)<<endl之类。
关键是还答错了一个,很尴尬
9、多线程的同步方法和如何使用
锁
中断
信号量
原子操作
…
10、进程间通信的方法,还有它和socket通信的相同和不同点在哪儿,使用时机是何时?
管道
消息
共享文件
11、linux的进程间通信和windows有何不同?是否了解?
其实应该是消息机制的不同,没说好。
面完面试官说马上有第二面,等几分钟,我说ok,然后很快另外一个面试官就来进行第二面。
?
第二面(1 h 29 m)
1、聊项目,你这个项目的这个点是怎么实现的,难点在哪儿?
2、说说你做的最难的一个项目,讲一下为什么,难点在哪儿?
3、说说你收获最大的一个项目,说说为什么?
然后和我说了很久的项目的细节和效果表现
4、malloc和alloc的区别
为了说点我擅长的地方,我额外讲了一下操作系统的页和操作系统对进程的内存分配方式还有段页的情况,内存碎片,还有malloc背后的空闲内存链表,然后回答了问题——两者的不同点。
5、你实现的vector和STL的vector的区别和优越性。
空间复杂度很高,但是时间复杂度比STL的要低。
6、vector何时进行空间的搬运?
老问题。
7、大批量对象的搬运进行了怎样的优化?
讲了一下placement new 和operator new的不同表现,和通过placement new进行内存搬运的优点
8、为什么要vector的新空间为2倍?
我记不太清了,就随便说了一下内存对齐之类的。
9、找出其他所有的数都出现两次的数组中只出现一次的数。
这个一直想不起来最优解,关键是我以前刷过这个题。
先说了一个直接冒泡比较的暴力方法,然后用快排思想想了一个优化方法,还用到了map,就是想不起来异或这个简单的方法,真是让人头大。
10、现场写代码,翻转句子中的单词(如hello world – > olleh dlrow),翻转句子中单词的顺序(hello world --> world helllo)
这道题后一个也一直没想出最优解。
差不多就是这样了,感觉编程题的算法不算很难,但主要是考验你的代码能力和debug能力,对于基础这些问的很仔细和全面,操作系统,C++,网络,linux,数据结构和基本工作会用到的算法,都问了一个遍,问了的基本上都答上了(除了linux方面的东西,我直接说的我不太熟悉就没再问了)。
面完第二天给我打电话约第二天晚上面试,然后第二天早上给我打电话,因为面试官临时有事更改到了后一天,其实这样也好,缓解了一下我的紧张。
?
第三面(45min)
感觉这面答得不算太好,虽然全都能说很久,但是深度没说上去,一直在说车轱辘话。
1、自我介绍
2、介绍一下你的这几个项目
3、你这个项目的细节
然后就一直在交流我的项目,说了挺久,感觉面试官是这方面的大佬
4、项目细节和我具体项目有关,就不多说了
5、讲一下malloc的整过程
然后一样的说。
6、讲一下如何设计内存管理系统
我说要根据不同的使用习惯来构建不同的分配和管理策略,然后就说了一下不同情况如何进行内存管理。
7、如何进行内存碎片的管理?
我这里的确有点忘记了,就大致说了一下malloc的解决方式,感觉没说好。
8、智能指针的实现方法
三面都有这个题,我就说了一下我熟悉的两个auto和shared。
9、那你用代码来实现一下这个shared_ptr
我就写了一下,模版编程,第一次写完一运行,爆了很多页的错,然后慢慢改,花了十多分钟,最后也算写好了。
然后写了一段测试跑了一下,然后又有点错,然后又改,慢慢完善,然后面试就基本上要结束了。
10、一段代码,说一下运行结果
class A {?
public: void f1() { }?
virtual void f2() {}
};
A* a = nullptr;?
a->f1();?
a->f2();
1
2
3
4
5
6
7
比较简单,但是直接说出来肯定没什么亮点。
就再说了一下this指针,然后讲了一下类与成员函数的关系,如何通过编译器的方式去实现的成员函数,和成员变量的访问方式……
11、有什么想问的吗?
问了几个组内的情况和我如果能进的话做什么的情况,就结束了。
?
以上~