百度C++开发实习面经(已offer call)
按照我的往常经验,面完一轮后会再约时间第二轮,而百度招聘又说实习生面试在四月的三个周末,所以我以为第一个周末一面,第二个周末二面,第三个周末三面,没想到一天搞完三面。我约的是4.1 11:00-12:00,三面完的时间是14:20,中间吃饭花费了15min。早知道如果是这样紧凑的流程,我就预约下午的好了。。
突然发现自己已经大橘已定了,新鲜出炉的面经,回馈牛客
百度一面
4.11 C++开发 50min
项目,问了下华为比赛流程
华为比赛是偏算法的,为啥不找算法岗
为啥本科没实习
Q:常用STL容器
A:vector,支持下标,内存连续,resize,capacity,摊还分析push_back
Q:vector与list元素个数相同,遍历一遍,哪个快
A:vector更快,list需要指针,vector是连续内存,因为有L1L2L3缓存,可以更快
Q:为什么更快
A:缓存层级,金字塔,经常使用的话放在更上一层缓存,读取就更快
Q:CPU高速缓存的逻辑
A:经常使用的数据放在更高的缓存,如果在缓冲中没找到,就用LRU这种缓存置换算法
Q:unordered_map与map
A:红黑树,特殊的BST,有序
Q:(打断)红黑树是啥结构
A:巴拉巴拉
Q:与AVL树的区别
A:AVL是严格平衡,旋转可能更多,红黑树的优势在于稳定性,插入和删除都是O(logn)
Q:说说哈希表
A:哈希冲突,开链法,开放地址法,退化成链表,装载因子,质数,rehash巴拉巴拉
Q:如果哈希函数很烂,很多元素挂在一个槽的链表里面,有什么优化措施吗
A:不用链表用红黑树
Q:开放寻址法怎么删除元素
A:不能直接删,得做个删除标记
Q:如果删除了很多元素怎么办
A:重新哈希一遍(重新再插一遍)
Q:还知道其他的数据结构,插入与删除效率比较高
A:跳表巴拉巴拉(根据极客时间的知识点说的)
手撕代码:实现String(推荐陈硕大神写的面试中常见的string的写法
信号量与条件变量的区别
Atomic内存序(不太记得了)
你还知道什么了解的比较深的(拥塞控制算法bbr巴拉巴拉
在一个函数调用前后打印时间戳计算时间,一个函数调用内第一行和最后一行打印时间戳计算时间,如果两种时间相差很大,有什么原因(以为是函数栈帧方面的底层,但其实是拷贝传参,析构局部变量可能很耗时)
总结:不算很难,很多问题我都可以展开讲很多。最后一个问题挺有意思的,面试的时候没想到,面试官还提示说你肯定知道,但是忘记了。最后评价我还是挺优秀的,除了一些细节,等一下就去二面吧。
百度二面
4.11 50min
个人介绍
条件断点和打日志是怎么操作的,举个例子(官方给了一个通过线上调度器打印的日志,里面是每一秒全地图的道路信息,我用自己复现的调度器,与它diff,发现在第1000行,在road_id=2000的道路,第15号槽,两个日志不一样,于是就可以在IDE中做条件断点巴拉巴拉)
网络分层模型(OSI七层,也有四层的说法,但一般说五层)
TCP与UDP是哪层,有什么区别(巴拉巴拉
如果传输文件用TCP还是UDP(想可靠就TCP,想快速就UDP
如果UDP怎么做简单的可靠传输(我说校验和,他说行
HTTP在哪层,HTTPS多了什么(TLS握手,交换非对称密钥,巴拉巴拉
加密算法了解多少(对称、非对称、签名巴拉巴拉
指针与引用的区别
内存中,堆和栈的区别,底层是什么数据结构,栈的最大值是多少
new和malloc的区别
delete和free的区别(与new和malloc差不多,C中malloc和free是一对,C++中new和delete是一对,delete先析构对象再回收内存,里面会调用free)
手撕代码:
1)面向对象,写三个class,动物、狗、猫,你自己发挥(访问控制权限符、virtual、多态、虚析构巴拉巴拉,然后解释了一下)
重写和重载的区别,在刚才的class里随便实现一下重载
2)写个二分查找的函数,用main函数调用,一次性work了
总结:也不算特别难,挺基础的问题,这时候已经一点多了,让我先去吃个饭,然后三面
百度三面
4.11 35min
自我介绍
static关键字与public与private的区别(这完全是两个范畴吧。。一个是修饰静态,一个是访问控制修饰符,全部解释了一遍)
public与private的区别(公开、私有巴拉巴拉)
new,先执行父类构造还是先执行子类构造(先父类再子类)
父类与子类的函数名可以相同吗(虚函数用同名函数可以实现多态,非虚会重定义)
重载与重写的区别(二面刚问过。。)
手撕代码:给你一个每行包含url的文件,统计出现最多的10个url
我不太记得文件操作的API了,string的分割也忘了,最后允许我化简成了关于url的数组,我先是用map记录了每个url与其出现的次数,然后构造一个最大堆(后来才发现我构造的是最小堆,cmp那总是记反-_-),堆元素是一个pair,记录着url与其出现次数,自定义了比较函数,比较出现次数(也就是pair的第二项)
说说冒泡排序、快速排序、堆排序在这种联机情况下的区别(也就是一边输入,一边得到当前的topk)
比赛中你的角色是什么,人员有流失吗
对数据库熟悉吗
对Linux熟悉吗
比赛是偏向于创新性、演示性还是工程应用?