面试复盘|百度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++工程师#
全部评论
emplace_back本身是模版函数,如果调用的参数是{1,2,3}无法推断出上面是initializerlist必须用push_back是这个缺点吗?
1 回复 分享
发布于 2021-08-15 15:27
下周百度三面, 求个好运通过
1 回复 分享
发布于 2021-08-14 22:40
应该怎么实现一个weak_ptrz 请问楼主这个怎么回答哇,这也太底层了
点赞 回复 分享
发布于 2021-08-29 22:42
请问一二三面的面试官都是什么性别呀
点赞 回复 分享
发布于 2021-08-20 19:28
太强了!
点赞 回复 分享
发布于 2021-08-17 09:18
请问楼主base投的哪里啊
点赞 回复 分享
发布于 2021-08-17 00:16
emplace_back会造成引用失效
点赞 回复 分享
发布于 2021-08-15 16:48
好强
点赞 回复 分享
发布于 2021-08-15 14:32
真难啊我凑
点赞 回复 分享
发布于 2021-08-15 09:40
楼主有hr联系嘛,我昨天面完三面,也没hr什么的,怎么确定过没过啊,就一直等嘛
点赞 回复 分享
发布于 2021-08-15 09:29
楼主c++都看一些什么书啊,自己也是c++,但是完全没有掌握这门深入,平时用到的太少了,就刷题用用😂
点赞 回复 分享
发布于 2021-08-15 00:36
点赞 回复 分享
发布于 2021-08-15 00:19

相关推荐

05-23 12:00
门头沟学院 C++
&nbsp;5.22一面,总共时长125min1.如何保护用户的隐私2.int*&nbsp;createArray()&nbsp;{int&nbsp;arr[3]&nbsp;=&nbsp;{1,&nbsp;2,&nbsp;3};&nbsp;return&nbsp;arr;}&nbsp;这段代码有什么问题3.对上述代码进行改进,写出能想到的所有方法(我写了一个malloc,全局数组,静态数组)4.说一下三种方式的优缺点5.全局数组和静态数组有什么区别6.解释完美转发的作用及实现方式7.const&nbsp;int*,int&nbsp;const*,int*&nbsp;const,&nbsp;const&nbsp;int*&nbsp;const的区别8.实现一个无锁计数器9.调用C++11实现一个线程安全的有界环形队列(circular&nbsp;buffer),要求如下:支持多线程环境下的并发push和pop操作,队列有固定容量,满时push操作要阻塞,空时pop操作要阻塞。不允许使用第三方库,只能用C++11标准库,说明你的实现如何保证线程安全,并分析可能的性能瓶颈。10.unique_lock&nbsp;和&nbsp;lock_guard的区别,为什么你刚才给我的代码用的是unique_lock&nbsp;而不是&nbsp;lock_guard&nbsp;呢11.你写的代码的性能瓶颈是什么?如果有大量得到生产者和消费者会怎样呢12.把第9个改成非阻塞的,写一下,为什么你这个非阻塞用lock_guard这个锁呢13.有一类二叉树用三叉链表来存储的时候除了带有指向左右孩子节点的两个指针,还有指向父节点的指针,那么这样一棵二叉树有n个节点,那么有多少指针指向NULL(对于不存在的节点表示为空)14.int&nbsp;n&nbsp;=&nbsp;2019;&nbsp;int&nbsp;count&nbsp;=&nbsp;0;&nbsp;&nbsp;while(n){count++;&nbsp;n&nbsp;=&nbsp;n&amp;(n&nbsp;-&nbsp;1);}&nbsp;cout&nbsp;&lt;&lt;&nbsp;count&nbsp;&lt;&lt;&nbsp;endl;输出是多少,为什么15.给定一个递增循环整数数组,从里面找出最小的元素,使用的算法越快越好。特别地,最小的元素可能出现在数组中间。比如:50,52,63,90,3,8,15,44,49,int&nbsp;findmin(int&nbsp;array[]){}16.在二叉排序树上面找出第3大的节点。注意:不能把二叉树全量存储到另外的存储空间,比如存储到数组中,然后取出数组的第三个元素。class&nbsp;TreeNode&nbsp;{public:int&nbsp;value;TreeNode*left;TreeNode*&nbsp;right};TreeNode*&nbsp;find(TreeNode*root)&nbsp;{}17.动态规划题:给定一个长度为l的木棍,已知有n个切割点,要求在每个切割点都要切割,注意每次切割的开销为当前木棍的长度,例如一个10米的木棍,切割点为2,4,7。有多种切割方式,其中可以先切2,再切4,再切7,此时开销为10+8+6=24(第1次切木棍为10米,笑2次切木棍为8米,第3次切木棍为6米),也可以先切4,再切2,再切7,出约著销为10+4+6=20,这时开销更小你的任务是计算切割的最小开销。
腾讯一面2138人在聊 查看17道真题和解析
点赞 评论 收藏
分享
评论
15
98
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务