面试复盘|百度C++开发连续三面复盘

这次可能有点记不太清楚了,尽量的回忆一下,从下午4点到7点半 百度连续三次面试,好像是提前批快截止了。
我意向是后端,但是百度地图一面给我挂了,这次被另一个部门捞起来,不过是客户端团队。

一面

  1. 一面面试官没有开他的视频,麦克风质量很差,基本听不清,所以比较吃力。
  2. 开局自我介绍,说他们是客户端的,我说愿意转客户端。
  3. 他说他们主要看中基础,问我STL了不了解,我说比较熟悉
  4. 问vector容器的扩容?
  5. vector容器的删除方法?我 erase,remove,swap
  6. 追问erase和remove区别
  7. 追问迭代器失效问题
  8. 写一个方法,删除vector<char>里面的空格,我说有两个方法,第一个是O(n^2)的复杂度,用自带的erase,第二个是用双指针。
  9. 先写一个erase的版本,中间涉及到失效问题,问我erase的返回值,过程有点坎坷,也听不清
  10. 写双指针版本,刚开始写反了,后来改过来了
  11. 问我头文件的重复引用问题,还有循环引用问题 怎么解决
一面时间不长,主要是和我纠结在vector的删除这一块,然后和我说让我等着别退,二面马上开始

二面

  1. 开局自我介绍,面试官说他们是客户端,我当然同意
  2. 他们比较注重C++的基础,问我C++11知道哪些?
  3. 智能指针了解哪些?shared_ptr怎么实现的 口述一下,引用计数怎么维护的,说一下
  4. unique_ptr解决了什么问题,怎么实现的
  5. weakptr解决了什么问题,应该怎么实现一个weak_ptr
  6. 说一下vector的扩容机制
  7. 接下来面试官向我分享了他的屏幕,没错,向我分享了 屏幕里面是5个左右的代码小片段 一个一个来问
  8. 第一个代码片段是一个缓存的实现,问我这段代码实现的有什么问题,如何改进?
    1. 代码中用list实现的,我说查询效率不高 应该类似LRU那样加入一个map
    2. list使用push_back插入的,改用emplace_back效率更高
    3. 代码中的缓存数量是固定的,超过之后没有报错机制
    4. 代码里面没有考虑多线程时候的场景。。
    5. 大概就这些吧,源代码我记不清了
  9. 第二个代码片段坑很大,首先构造了一个set,往里插入了1 2 2 3,然后构建了一个vector<int> vec(5,0),然后使用copy将set里面的数字拷贝到vec中。并用(auto i = vec.size()-1; i>=0; i--)这样的方法遍历。问我输出。
    1. 第一点我说set是个有序集合,插入之后默认排序是123。面试官反问为什么有序,我说红黑树,面试官问为什么用红黑树,我说因为有序的保证要用二叉平衡搜索树,比如AVL和红黑树。面试官问我为什么不用AVL树。我说是性能和XX的折中。让我介绍一个红黑树的查找,还有简介一下插入。
    2. 第二点 我说输出是 0 0  3 2 1
    3. 面试官追问我,auto是干嘛的 我说是类型推导,她问在这里是什么类型,我说应该是size_t 无符号类型的整数
  10. 第三个题目和第二个其实有关系,我第二题回答还是有误的。第三题也是一个循环,一个无符号的数组,还有一个无符号的容量。代码的大意是判断数组空间够不够,够的话memcpy一下。面试官问我问题,看了好一会发现,代码里面有个无符号相减会导致溢出的问题。然后回答了之后,面试官让我反看第2题,发现(auto i = vec.size()-1; i>=0; i--)其实也是这样的问题,这是一个死循环。。。。太坑了
  11. 第四个问题有意思了,说file.h里面有个class 叫 Foo,然后在外面有个函数
    // file.h 中 有class Foo
    void fun(Foo* ptr)
    {
        ptr->bar();
    }
    fun(NULL);
    问我这个fun(NULL)会有几种可能
    1. 我说,如果是空指针,可能会造成段错误,内存越界  他说:算一个
    2. 第二,我说如果这个bar函数不存在的话,编译错误  他:勉强算一个
    3. 第三:如果这个bar是类里面静态函数,可以调用成功  他:对
    4. 剩下的是在被提示的情况下,慢慢想出来的 第四:如果bar里面没有用到this指针的内容,也能调用成功 如果用到了调用失败
    5. 第五 如果bar是个虚函数,需要通过this来找这个虚函数表,会错误
  12. 紧张刺激的代码过后,继续问我问题,模版熟悉吗,讲讲模版优缺点
    1. 泛化 blabla ,代码膨胀... ,面试官:还有呢
    2. 可以C++11里面使用可变模版参数。 面试官:说说怎么实现可变模板参数,我说递归调用,需要有个空模板做为递归终点  blabla
    3. 你用过这个可变模板参数吗?我说没用过,但是在stl源码里看见过
  13. 问我关系型数据库,如何设计,你设计的时候应该考虑什么
  14. 问我迭代器这个概念为什么存在,面试官强调,不是问你如何实现迭代器?我解释了一下,什么底层透明性啊之类的
  15. 问我函数对象和函数指针有什么区别,函数对象这个东西会存在,目的是啥?我想了一会,从函数对象是个类成员说起,可以维护类里面的变量,是个有状态的,面试官说对了
  16. 其他的记不清, 记起来在补充吧  让我继续三面,马上就开始,别退出会议

三面


  1. 三面就不是技术面了,主要是问我本科还有研究生经历,有几个问题很值得琢磨
  2. 问我为什么本科毕业时候没想出来搞开发吗
  3. 为什么读研之后开发,我看你一直在做算法,也有几篇论文。。。blablabla
  4. 你觉得上了研究生对你帮助最大的是什么
  5. 还有各种问题 类似这种的  不写了
  6. 最后 反问:面试流程是什么样的,他说这是最后一个面试,提前批的流程结束了,如果过了 HR会给你发意向书,但是没有薪资,需要和秋招正式批的一块。还问了团队培养新人的流程。。。
  7. 愉快问好,辛苦了

反思:

面试官问我emplace_back有什么缺点,我一时间没想起来,也没查到什么好的参考资料,不知道大家有什么高见可以告知一下~谢谢大家

总的来说,今天下午连续三个半小时的面试就告一段落了,我也没想到这么的突然,尽力了。希望能过吧,许愿offer~
@牛客人品酱 攒人品
#面试复盘##面经##校招##百度##C++工程师#
全部评论
下周百度三面, 求个好运通过
1 回复 分享
发布于 2021-08-14 22:40
emplace_back本身是模版函数,如果调用的参数是{1,2,3}无法推断出上面是initializerlist必须用push_back是这个缺点吗?
1 回复 分享
发布于 2021-08-15 15:27
点赞 回复 分享
发布于 2021-08-15 00:19
楼主c++都看一些什么书啊,自己也是c++,但是完全没有掌握这门深入,平时用到的太少了,就刷题用用😂
点赞 回复 分享
发布于 2021-08-15 00:36
楼主有hr联系嘛,我昨天面完三面,也没hr什么的,怎么确定过没过啊,就一直等嘛
点赞 回复 分享
发布于 2021-08-15 09:29
真难啊我凑
点赞 回复 分享
发布于 2021-08-15 09:40
好强
点赞 回复 分享
发布于 2021-08-15 14:32
emplace_back会造成引用失效
点赞 回复 分享
发布于 2021-08-15 16:48
请问楼主base投的哪里啊
点赞 回复 分享
发布于 2021-08-17 00:16
太强了!
点赞 回复 分享
发布于 2021-08-17 09:18
请问一二三面的面试官都是什么性别呀
点赞 回复 分享
发布于 2021-08-20 19:28
应该怎么实现一个weak_ptrz 请问楼主这个怎么回答哇,这也太底层了
点赞 回复 分享
发布于 2021-08-29 22:42

相关推荐

点赞 评论 收藏
分享
评论
15
97
分享
牛客网
牛客企业服务