字节跳动社招三面面经

C++我推荐几本书 看完基本上八股大部分都能行 
1.《C++ pirmer plus》 哪怕你觉得自己C++再行我还是建议至少把这本书过一遍 
2.《深度探索C++对象模型》 读完这本书你应该可以在简历上写一个熟悉C++ 
3.《Effective C++：改善程序与设计的55个具体做法》 看了对C++编码帮助挺大 
以上三本书看完 C++面试岗过的话问题应该都不大 

操作系统： 
1.《深入理解计算机系统》神书，不用我多推荐了 
2.《现代操作系统》上面那本看不懂可以先看看这本书 

计算机网络： 
1.《计算机网络自顶向下方法》 

然后是面经 

------------------------------------------------------------------------------------------
一面 06.08 

1.自我介绍 
2.问项目，深挖项目中遇到的问题 
3.C++11的特性知道哪些 
4.C++智能指针 
5.unique指针怎么修改 
6.多态(重写和重载，虚函数表，虚指针balabala 
7.构造函数能被声明为虚函数吗，为什么 
8.析构函数需要被声明为虚函数吗，为什么‘ 
9.new和malloc的区别 
10.new底层是用什么实现的 
11.new实现需要类型转换吗 
12.调用析构函数的时候 类型是void类型，指向的是类对象，会正确调用析构函数吗 
13.vector/list/map的底层实现，增删改查复杂度 
14.const关键字，const怎么修改 
15.进程和线程的同步方法，效率，那种效率最高，为什么 
16.算法：求链表的第K个节点，说下思路(双指针) 
17.自己写测试用例测试 
数组的TOPK，给一个数组，求数组的前K个小的数字并返回 
这里我说了快排，堆排，但面试官说并不是最优解 

面试完我回想了一下，这里求前K个小的数字，只需要返回这个数组的容量为K的子数组，这个子数组的最大元素小于等于另一个剩余数组的最小元素即可 
这里抛砖引玉，我认为应该找到一个数组元素作为基准将其分成两部分，小的部分如果容量大于K再对其进行二分，如果小于K，对大的数组再划分剩余部分，等于K返回即可，其实有点像快排的思想 
反问环节 
当晚收到二面邀请 

----------------------------------------------------------------------------------
二面 06.10 交叉面 

1.自我介绍 
2.问项目，深挖项目中遇到的问题 
3.上一面问C++，这面问操作系统，问计算机网络 
4.TCP三次握手 
5.TCP如何保证可靠传输 
6.TCP重传 
7.数据库锁 
8.内核态和用户态 
9.内核态用户态切换 
10.程序在开始运行的时候，内核态和用户态都发生了什么 

算法： 
给定一个网址 
输出倒序网址和每个点为坐标的倒序 
举例： www.baidu.com 
写第一个函数，输出 www.udiab.moc 
写第二个函数，输出com.baidu.www 
反问 
当晚收到三面邀请 

-----------------------------------------------------------------------------
三面 06.15 

1.自我介绍 
2.介绍项目
3.做过的项目里，哪个项目的收获最大 
4.vector的push_back函数，时间复杂度是多少，涉及到vector容量不足发生拷贝的时候，时间复杂度又是多少，这两个的平均时间复杂度是多少 
5.进程和线程的同步方式，哪些同步方式可以用在线程中，哪些同步方式可以用在进程中而不能用在线程中 
6.同步方式哪种效率最高，为什么 
7.前面几面你认为自己有哪些地方可以答得更好，有哪些地方不足 
8.算法： 
输出树的所有既是叶子节点又是左节点的值的总和 
我先用了递归，问了下时间复杂度，能用非递归实现吗 
然后用非递归又写了一次 
反问 

总体体验就是自己的操作系统得好好看看 算法效率，重底层 
想进字节就得多思考，多看书
