面试复盘|百度C++开发连续三面复盘
这次可能有点记不太清楚了,尽量的回忆一下,从下午4点到7点半 百度连续三次面试,好像是提前批快截止了。
我意向是后端,但是百度地图一面给我挂了,这次被另一个部门捞起来,不过是客户端团队。
一面
- 一面面试官没有开他的视频,麦克风质量很差,基本听不清,所以比较吃力。
- 开局自我介绍,说他们是客户端的,我说愿意转客户端。
- 他说他们主要看中基础,问我STL了不了解,我说比较熟悉
- 问vector容器的扩容?
- vector容器的删除方法?我 erase,remove,swap
- 追问erase和remove区别
- 追问迭代器失效问题
- 写一个方法,删除vector<char>里面的空格,我说有两个方法,第一个是O(n^2)的复杂度,用自带的erase,第二个是用双指针。
- 先写一个erase的版本,中间涉及到失效问题,问我erase的返回值,过程有点坎坷,也听不清
- 写双指针版本,刚开始写反了,后来改过来了
- 问我头文件的重复引用问题,还有循环引用问题 怎么解决
一面时间不长,主要是和我纠结在vector的删除这一块,然后和我说让我等着别退,二面马上开始
二面
- 开局自我介绍,面试官说他们是客户端,我当然同意
- 他们比较注重C++的基础,问我C++11知道哪些?
- 智能指针了解哪些?shared_ptr怎么实现的 口述一下,引用计数怎么维护的,说一下
- unique_ptr解决了什么问题,怎么实现的
- weakptr解决了什么问题,应该怎么实现一个weak_ptr
- 说一下vector的扩容机制
- 接下来面试官向我分享了他的屏幕,没错,向我分享了 屏幕里面是5个左右的代码小片段 一个一个来问
- 第一个代码片段是一个缓存的实现,问我这段代码实现的有什么问题,如何改进?
- 代码中用list实现的,我说查询效率不高 应该类似LRU那样加入一个map
- list使用push_back插入的,改用emplace_back效率更高
- 代码中的缓存数量是固定的,超过之后没有报错机制
- 代码里面没有考虑多线程时候的场景。。
- 大概就这些吧,源代码我记不清了
- 第二个代码片段坑很大,首先构造了一个set,往里插入了1 2 2 3,然后构建了一个vector<int> vec(5,0),然后使用copy将set里面的数字拷贝到vec中。并用(auto i = vec.size()-1; i>=0; i--)这样的方法遍历。问我输出。
- 第一点我说set是个有序集合,插入之后默认排序是123。面试官反问为什么有序,我说红黑树,面试官问为什么用红黑树,我说因为有序的保证要用二叉平衡搜索树,比如AVL和红黑树。面试官问我为什么不用AVL树。我说是性能和XX的折中。让我介绍一个红黑树的查找,还有简介一下插入。
- 第二点 我说输出是 0 0 3 2 1
- 面试官追问我,auto是干嘛的 我说是类型推导,她问在这里是什么类型,我说应该是size_t 无符号类型的整数
- 第三个题目和第二个其实有关系,我第二题回答还是有误的。第三题也是一个循环,一个无符号的数组,还有一个无符号的容量。代码的大意是判断数组空间够不够,够的话memcpy一下。面试官问我问题,看了好一会发现,代码里面有个无符号相减会导致溢出的问题。然后回答了之后,面试官让我反看第2题,发现(auto i = vec.size()-1; i>=0; i--)其实也是这样的问题,这是一个死循环。。。。太坑了
- 第四个问题有意思了,说file.h里面有个class 叫 Foo,然后在外面有个函数
// file.h 中 有class Foo void fun(Foo* ptr) { ptr->bar(); } fun(NULL);
问我这个fun(NULL)会有几种可能- 我说,如果是空指针,可能会造成段错误,内存越界 他说:算一个
- 第二,我说如果这个bar函数不存在的话,编译错误 他:勉强算一个
- 第三:如果这个bar是类里面静态函数,可以调用成功 他:对
- 剩下的是在被提示的情况下,慢慢想出来的 第四:如果bar里面没有用到this指针的内容,也能调用成功 如果用到了调用失败
- 第五 如果bar是个虚函数,需要通过this来找这个虚函数表,会错误
- 紧张刺激的代码过后,继续问我问题,模版熟悉吗,讲讲模版优缺点
- 泛化 blabla ,代码膨胀... ,面试官:还有呢
- 可以C++11里面使用可变模版参数。 面试官:说说怎么实现可变模板参数,我说递归调用,需要有个空模板做为递归终点 blabla
- 你用过这个可变模板参数吗?我说没用过,但是在stl源码里看见过
- 问我关系型数据库,如何设计,你设计的时候应该考虑什么
- 问我迭代器这个概念为什么存在,面试官强调,不是问你如何实现迭代器?我解释了一下,什么底层透明性啊之类的
- 问我函数对象和函数指针有什么区别,函数对象这个东西会存在,目的是啥?我想了一会,从函数对象是个类成员说起,可以维护类里面的变量,是个有状态的,面试官说对了
- 其他的记不清, 记起来在补充吧 让我继续三面,马上就开始,别退出会议
三面
- 三面就不是技术面了,主要是问我本科还有研究生经历,有几个问题很值得琢磨
- 问我为什么本科毕业时候没想出来搞开发吗
- 为什么读研之后开发,我看你一直在做算法,也有几篇论文。。。blablabla
- 你觉得上了研究生对你帮助最大的是什么
- 还有各种问题 类似这种的 不写了
- 最后 反问:面试流程是什么样的,他说这是最后一个面试,提前批的流程结束了,如果过了 HR会给你发意向书,但是没有薪资,需要和秋招正式批的一块。还问了团队培养新人的流程。。。
- 愉快问好,辛苦了
反思:
面试官问我emplace_back有什么缺点,我一时间没想起来,也没查到什么好的参考资料,不知道大家有什么高见可以告知一下~谢谢大家
总的来说,今天下午连续三个半小时的面试就告一段落了,我也没想到这么的突然,尽力了。希望能过吧,许愿offer~
@牛客人品酱 攒人品