百度后端C++研发工程师2019年秋招面经总结

面试之前把百度C++的面经捋了一遍。

面试总结:

1. 强度大。三轮技术面,中间几乎不休息。时间长度在三小时到四个半小时之间(我就被连续搞了四个半小时)。个人来说,一面偏实习项目介绍和算法。实习项目抠的非常细,面试官把各种情况的处理问了一遍,假如不是你做的肯定会被问的比较尴尬。。。项目结束两道算法题,一道剑指 offer里复杂链表复制,第二道让对其进行优化,要求比剑指 offer里的实现算法少一半时间。二面主要问算法题。两道,都与海量数据处理优化有关。会穿插问开放性的题目。三面一道动态规划,一道存储的优化。三面应该是主管,会问个人的其他问题,不全是技术。百度面试后一个周出结果,整体效率高,不拖沓,面试强度大。附上自己整理的面经,比较乱,有空整理,内容算比较全。

 

 

算法:

3、手写算法:反转链表(经典题么????)

2、手写算法:单链表求和

1、手写堆排序

1、手写算法:随机散列长

输出字符串中最长的回文子串长度?

5、桶排序】

7、了解数据结构?图如何表示?图广度遍历用什么结构?

4、熟悉设计模式?手写下单例模式?

5、手撕代码int atoi(char *str)?

9、数组存中在一个大于n/2次的数,如何以最优方法查找它?

10、用栈实现队列,用队列实现栈?

ab ba互为兄弟子串 abc acd也是,求字典中兄弟子串的个数,其实就是把字符串按字典序排序,然后记录重复数量,用hash来记录。

  • 统计一个文件中前十多的ip地址
  • https://blog.csdn.net/FX677588/article/details/72643302
  • https://zhidao.baidu.com/question/402662928.html
  • topk问题
  • 写一个strcmp
  • 寻找最长的递增子序列
  • LRU实现,以及几种优化
  • 栈的逆序操作,不能使用额外的数据结构。
  • 二面:连续子数组最大和(dp问题)

排序,所有数字大小都在a到b之间,要求线性时间

  1. 写个string类
  2. 12、64匹马、8赛道,知识多少轮比赛找出速度最快的4匹马?(在提示下优化到12次,最优解为10或者11次)

3、常见排序算法,快速排序时间复杂度,时间复杂度稳定在O(nlogn)的排序算法

4、100G的数组排序,只有2G内存,怎么排序

假设1-10000这一万个数中缺了一个怎么把他找出来,缺俩个,缺多个。如果范围为1-1e呢?

假设给你一个数n,问你这个数是不是2^k次,你的算法时间复杂度是多少,如果有一亿个数,如果数的范围在2^64范围内呢。

两个单向链表,有公共节点,有多少种结构。(考虑有环和无环的各种情况)

链表随机得到一个数字(最多遍历一遍,随机地返回其中任意一个数,我理解了很久,最后我想出的答案应该是错了。。。)

131个金币,其中有一个是假币,找出来

8、还是LRU cache,用链表和哈希表实现

9、代码题:输入一个数组和一个target,将数组中小于target的数放到数组左边,大于target的数放到数组右边。

问了数据结构,数组和链表的区别,栈和队列的区别,如何用栈查找最小值;

写个string_to_float

n个有序链表,合并成一个

字符串A,B,在A中删除B中出现过的字符

对一个文件做处理,取出带A关键字的行的最后一个字符串,统计重复度。一开始要我用shell脚本写,我说不会,就让我C++写

整数数组A[n],元素取值范围在[l,u]之间,排序,时间复杂度要为线性,稳定排序。写了个桶排

二叉树知道后序中序求前序遍历

6)数组连续子数组的最大和

12,什么是单向链表,如何判断两个单向链表是否相交,手写代码,并分析时间复杂度

3.手撕代码,求二叉树的宽度(层次遍历,节点数最多那层的宽度,即为二叉树的宽度);

找到数组中只出现一次的数 找到1~n-1的数中重复的数 找到数组中第k大的数

写出40以内的质数,连续相邻的两个质数,如果相差为2的话,那么中间那个数一定是6的倍数,证明它

堆排序和快排

.求topk,说思路;(tips:①排序②堆③快排思想

两道编程:寻找两个单链表的相交点、字符串按单词逆序。

2.给a,b两个文件,里面分别有50亿个URL,每个URL大小64B,给4G内存,求相同的URL。

 

3.编程:给一个字符串比如“19213112”,返回所有可能的ip地址返回“192.13.11.2”“192.1.31.12”

2.从一组数中找出和为sum的三个数(leetcode原题,先sort再找,并且剪枝),写代码,四个数呢?说思路。

3.快排过程,如何用单链表实现快排?(用两个从头出发的指针实现)

5.若干个二叉树,如何按照层序遍历。(即先遍历树1的头结点,再遍历树2的……)

7.string转float,写完后,告诉我没考虑异常情况(string中含有字母等)

2、智力题:对一批编号为1-100,全部开关朝上(开)的灯进行以下***作:凡是1的倍数反方向拨一次开关;2的倍数反方向又拨一次开关;3的倍数反方向又拨一次开关……问:最后为关熄状态的灯的编号是哪些?

 

4、数据库的范式?

https://blog.csdn.net/Dove_Knowledge/article/details/71434960

https://blog.csdn.net/QingKing520/article/details/52937728

5、如何防止数据库被攻击?(我:我项目里的数据库不会被攻击)

https://blog.csdn.net/websinesafe/article/details/80821984

6、linux的指令都知道哪些?

3、TCP和UDP都介绍一下,TCP-UDP区别?都适用于哪些业务场景?

首先还是把协议特性说一下,明白了特性自然知道应用场合了,嘿嘿!两种协议都是传输层协议,为应用层提供信息载体。TCP协议是基于连接的可靠协议,有流量控制和差错控制,也正因为有可靠性的保证和控制手段,所以传输效率比UDP低;UDP协议是基于无连接的不可靠协议,没有控制手段,仅仅是将数据发送给对方,因此效率比TCP要高。

基于上述特性,不难得到结论,TCP协议适用于对效率要求相对低,但对准确性要求相对高的场景下,或者是有一种连接概念的场景下;而UDP协议适用于对效率要求相对高,对准确性要求相对低的场景。

好了,现在回到你的问题,举几个应用的例子。TCP一般用于文件传输(FTP HTTP 对数据准确性要求高,速度可以相对慢),发送或接收邮件(POP IMAP SMTP 对数据准确性要求高,非紧急应用),远程登录(TELNET SSH 对数据准确性有一定要求,有连接的概念)等等;UDP一般用于即时通信(QQ聊天 对数据准确性和丢包要求比较低,但速度必须快),在线视频(RTSP 速度一定要快,保证视频连续,但是偶尔花了一个图像帧,人们还是能接受的),网络语音电话(VoIP 语音数据包一般比较小,需要高速发送,偶尔断音或串音也没有问题)等等。

作为知识的扩展,可以再说一些其他应用。比如,TCP可以用于网络数据库,分布式高精度计算系统的数据传输;UDP可以用于服务系统内部之间的数据传输,因为数据可能比较多,内部系统局域网内的丢包错包率又很低,即便丢包,顶多是操作无效,这种情况下,UDP经常被使用。

4、数据库的ACID介绍一下?

6、hash冲突怎么解决

进程线程区别?

3、linux下如何快速将文件每行倒序输出?shell或者编程都行,说了下python和c++实现方法,结果人考的是tac命令

    描述四次挥手过程,以及timewait、closewait?

    timewait过程如果出现过多拥塞或者网络不稳定导致很多非正常数据该如何解决?

    linux下如何查看特定端口有多少tcp连接?

6、手撕sql查询排序?

    如何通过索引优化该sql?

    谈谈Innodb中b+树?myisam和Innodb中b树有什么区别?

char (*p) [] 、char *p[]、char (*p)()的区别?

 

6、谈谈web上访问网址的过程?点开网页发生了什么

    说说DNS如何找到ip和port的?若本地和局域网查找不到,如何向上层查找(DNS服务迭代查询和递归查询的流程)?

    谈到get、post了,get和post的原理和区别?

    http和http2区别?http和https区别

    https中加密实在哪一过程进行了?

    说说ssl加密原理?

7、说说select、poll、epoll区别?

8、熟悉句柄么?程序执行后句柄如何处理,如何修改可打开句柄数量?

11、如何设计一个高并发的分布式服务器?

滑动窗口和流量控制区别

回调函数作用

http长连接和短连接

操作系统虚拟内存和物理内存的区别

static作用,怎么实现的

ip报文如何从下向上交付

gdb调试

如何设计服务端程序

  • 二进制中一个的个数
  • 把一个32位的int转成ip地址,八位对应一个ip的四分之一。

send和recv的缺点

一方发数据,另外一方不调用recv接收,中间会发生什么报文。

top命令,虚拟内存和物理内存对应那个字段

stl空间配置器

头文件中声明static变量,非static呢

多态的实现方式

进程通信方式

共享内存如何实现

  • 单例模式和观察者模式的类图
  • URL短网址设计,扯了很长时间

TLB是什么,有什么用

网站server与client间的通信安全,攻击者伪造身份怎么办,中间人攻击怎么防御

Linux的内存管理、slab机制介绍一下

https://blog.csdn.net/bullbat/article/details/7194794

网卡的工作流程

设计一个网站,实现多人同时抢票功能,保证先点击的人先进入页面,人满了或者没票了需拒绝

如何实现多人抢红包的功能,保证高并发和数据的一致性

实现一个聊天工具,在底层如何设计存储的数据信息,以支持类似微信聊天一样,支持删除信息(信息自己看不到,别人看得到)、撤回信息(信息自己看不到,别人看不到)和转发信息

 

缺页中断什么时候会发生

说下你知道的内核中所有用到内存zero copy的地方

写一个波浪子序列的题

linux中VFS是什么,和其他具体的文件系统如何配合工作的

介绍下epoll和iocp

  1. 虚基类
  2. 纯虚函数
  3. 虚函数
  4. 虚函数表内存分布
  5. 虚函数中虚基类和派生类的关系
  6. 显示转换
  7. http https 抓包工具原理
  8. IP地址分为几类?简单说一下分类
  9. 进程同步的方法

用什么来保证共享数据的安全性?

是原子操作。。

  1. 数据库索引 索引原理 以及如何优化数据库
  1. 为什么继承时基类的析构一般声明为虚函数?
  2. 虚函数与纯虚函数的区别
  3. 为什么构造函数不能够使虚函数

4.TCP端口扫描方式

6.守护进程

C++拷贝构造函数为什么传引用

如何返回值一个类的构造和拷贝构造

如果声明为私有的,那么是编译时错误还是运行时错误

vector越界访问下标

map越界访问下标

如何删除map中的奇数节点

指针和引用的区别

C++中内存泄漏问题

new和malloc的区别

HTTP中状态码 302(详细问) 403 400

连续子数组最大和问题

C++多态,虚标指针在什么时候初始化

STL库的容器底层实现

红黑树的插入效率,为什么相对平衡的红黑树比绝对平衡的AVL适用广

B树和B+树的区别,B+树应用在哪?

select和epoll,epoll底层实现,数据的拷贝方式。

滑动窗口和拥塞窗口

慢启动和快重传

实现一个功能,能检测内存泄漏问题,通过一个指令输出整个进程中哪一行哪个函数申请了多少内存,按照顺序排列出来,还有总的内存数

  1. Linux下的内存机制
  2. 模板的分离编译
  3. 空类的大小,含有成员函数类的大小
  4. 链接过程(详细)

说一下cache,LRU那种

这个怎么实现同步和互斥,怎么样去加锁

A:然后说了一下锁的相关知识,balabala

Q:c++里面的同步和互斥怎么实现的

A:mutex,条件变量之类的说了一下,消费者生产者之类的举了个例子

Q:c++里面的常量怎么定义

A:const和constexpr

Q:c++的智能指针说一下

Q:c++怎么实现一个函数先于main函数运行

A:用static 定义在main( )函数之前的全局对象、静态对象的构造函数在main( )函数之前执行。

Q:c++的static的变量的初始化顺序怎么样的

A:声明顺序就是初始化顺序

Q:如果一个类里面呢?

类外初始化

Q:两个文件,两个static变量a和b,怎么让某个变量先于另外一个初始化呢?0816

 

A:通过头文件的声明顺序

Q:其他用户不知道头文件的声明顺序怎么确定呢?

Q:来一条设计题。百度搜索的智能提示怎么实现,输入两个字,出来一些热搜

A:字典树+堆吧

海量问题总结

项目使用TCP长链接还是短链接,优缺点和各种适应的场景?

3)一致性哈希

5)红黑树设置红黑节点的作用,插入时间复杂度

8)多态 虚函数 虚表实习原理

11)求根号n

13)为什么使用epoll,epoll为什么高效,epoll回调是证明实现的

14)读套接口时候返回0,时候产生EAGIN。【EAGIN也不太清楚,知道又这个玩意,不知道具体的,应该直接说不知道】

输出字符串用%s,输出常整型用什么。

3)vector大小为100,范围1000的位置会怎样,map用【】范围不存在的key会怎样

4)new和maloc的区别

5)CPU又4核,如何编程让4个核都跑满

6)数组连续子数组的最大和

7)1到100的随机数,生成1到10000的随机数

8)linux常用命令

解释一下 函数重载 是怎么实现的

  • 编译器在汇编层结合函数名和参数类型给重载等函数不同的汇编实现。
  • C/C++ 时混编要使用extern告诉编译器这是不支持重载的C的代码

 

解释一下可变参数怎么实现的

  • 可变参数的使用 https://blog.csdn.net/qq_16628781/article/details/72717008

解释一下函数调用是怎么样的过程(怎么传參)

  • 简述函数栈帧图,即使用两个寄存器分别指向栈底(ebp)与栈顶(esp),通过ebp +— n访问变量or回到上一个栈帧
  • 函数栈帧 https://www.cnblogs.com/zlcxbb/p/5759776.html

基于上一个问题,解释一下多个参数的情况

  • 参数从右向左压栈,所以最后一个压入的元素是第一个参数
  • ebp-4放置了之前栈帧的返回地址,ebp到目标地址之间都是压入的参数
  • 函数栈帧 https://www.cnblogs.com/zlcxbb/p/5759776.html

-

解释一下 C++ 引用和指针的区别

  • 两者在汇编层面没有本质区别
  • 概念上讲,引用是变量的别名,具体区别如下
    • 指针不用初始化,而引用则需要
    • 指针的指向可修改,引用从一而终
    • 指针自增:指针偏移;引用自增:相当于原变量自增
    • sizeof(指针),32位4字节;sizeof(引用)== sizeof(变量)
    • 有多级指针,无多级引用
    • 引用更安全(指针判空)

解释一下 map和hash_map

  • https://blog.csdn.net/yusiguyuan/article/details/12883727

解释一下函数调用,比如 求最大值函数 和 fork/exec 函数有什么区别

  • 前者在用户态完成操作,后者由于权限问题,需要在内核态由内核完成
  • string类的实现、
  • 编程题第二道 单词统计

 

 

struct和class的区别

2,union和struct的区别

3,给一个struct分析占用多少内存

4,如果不想一个类被继承应该怎么办

5,装饰器模式和单例模式,使用单例模式应该注意什么

8,什么是死锁,怎么避免死锁

.linux命令求topk?(tip:多谢楼下大佬,sort+head即可)

5.TCP报文格式,http长短连接?

6.粘包是什么?如何处理?

1.写10个你熟悉的linux命令,带上你知道的所有参数;(写得不好,心理压力+1)

epoll底层实现

异步非阻塞io是什么样的模型,别的模型呢

线程池的实现

进程线程区别,公用和独立的部分

怎么查看进程占用内存

为什么线程更快

线程安全知道哪些方法

你说互斥锁和条件变量,这样会带来资源的竞争,知道什么优化办法吗

B+树和红黑树的差别,B+树的应用和时间复杂度

epoll的水平触发和边沿触发(这一块问的很深就,涉及到底层的实现和数据处理一半的情况等等)

如何解决高并发

如何实现数据容灾

怎样实现负载均衡

如何解决单节点负载过高(我答的通过监控与设置阈值,然后分流迁移,然后又问流量迁移了,数据怎么办,反正就是往深处问)

系统中的一致性问题

线程怎么访问互相的栈

虚函数,虚函数表,虚函数表是公用的吗

虚继承,多继承

string的length和size一样吗

string是怎么增长的

面向对象三大特性五大原则

1.libevent实现,IO+定时+信号事件如何集成统一

4.写代码,判断一个字符串中括号()、[]、{}的使用是否对应

5.给定两个日期,计算天数差

5.100个有序数组合并

6.一个数组最大连续子数组和?一个矩阵最大子矩阵和?

实现一个Stack类 要求 push pop max 操作时间都是O(1)

算法就提了一下 二分查找和快速排序

给你一个数字n,返回一个数组,数组为0-n这n个数每个数bit为1的位数(答案为找规律),时间复杂度要去为o(n),n前面不能有系数。

说一下快排和堆排序的时间复杂度一样,为什么使用快排的时候多一些。

1.多态能不能静态调用

2.内存中 堆和栈 的区别,栈底层如何实现?是一上来就分配4MB吗?缺页中断时操作系统怎么做?

3.epoll和select底层使用的数据结构

epoll的高效就在于,当我们调用epoll_ctl往里塞入百万个句柄时,epoll_wait仍然可以飞快的返回,并有效的将发生事件的句柄给我们用户。这是由于我们在调用epoll_create时,内核除了帮我们在epoll文件系统里建了个file结点,在内核cache里建了个红黑树用于存储以后epoll_ctl传来的socket外,还会再建立一个list链表,用于存储准备就绪的事件,当epoll_wait调用时,仅仅观察这个list链表里有没有数据即可。有数据就返回,没有数据就sleep,等到timeout时间到后即使链表没数据也返回。所以,epoll_wait非常高效。

 

4.给一个长方形,两个人分别在长方形里放硬币,硬币不能重叠,不能超出长方形以外,最后放的人获胜,问第一个放硬币的人必胜吗?

1 二叉树前序遍历,知道前序中序怎么确定二叉树,为什么知道前后不能确定

4迭代器失效

5虚拟内存介绍,new 2g内存,物理内存够,会在物理内存上吗?

6进程线程区别,多线程共享哪些资源

13什么时候开始事物(答得不好)

14inux查看监听端口,某个pid占用cpu,top

c++如何实现一个接口?(抽象类、纯虚函数)

传递一个指针进某函数体内,为什么不能对它重新分配空间

如果传入的是一级指针S的话,

那么函数中将使用的是S的拷贝,

要改变S的值,只能传入指向S的指针,即二级指针

,如果想要分配,应该怎么做?(指针的指针)

5.memcpy存在的问题(如果复制的地址有重叠,可能出现问题)?用memmove为什么不会有这种问题?请实现?(memmove开辟了一块临时空间)

6.相同二叉树(好像是任一层被颠倒顺序仍然认为这两颗树相同,例如root1->left = a,root2->right=b,仍然认为他们相同),计算你解法的时间复杂度。

8.叉树非递归后续遍历,

面试官然后出了2个算法题,一个是判断一个int有多少个1,一个是复杂链表的深拷贝,也是秒杀,然后就过了。

来了之后问STL熟悉么,喜欢什么容器,楼主说到map,问map怎么实现,红黑树,红黑树是啥,红黑树插入操作是怎么样的,当时就懵逼了,我说红黑树的插入太复杂了吧,我写个AVL树的插入吧,然后给我一个树,让我往里面插数,反正就是左旋右旋啥的,没问题。

然后做题,实现一个返回栈中最小数的函数,设计了一个 类,很简单。然后最后问了一个,大数据,几亿个数据排序,楼主说用位图,简单说了说思路,面试官说思路基本对,

特殊的地方,不允许使用STL容器,自己实现链表或是数组,要写出完整功能,包括构造析构函数。注意边界情况和内存泄漏

linux 读写锁的作用,适用场景

用你知道的同步机制实现一个读写锁。。。这个写了很久,最后勉强出来了

实现strcpy、问了linux一些命令

堆和栈的区别,

生产者消费者模型

如何定位检测内存泄露,

使用全局变量会有什么问题

介绍一下算法的时间复杂度与空间复杂度。

说一下c++的特性。

编译器对于虚函数是怎么处理的。

new,delete,malloc,free的区别

c++的内存分配方式。

说一下编译器对虚函数的处理,还是这个问题。(没答上来,只记得有一个虚函数表)

c语言各种变量所在的节

C++虚函数的实现

1. strcpy和memcpy的区别

2. 手写memcpy

3. linux下的malloc和free底层都干了什么事(调用free貌似系统不一定会真正释放内存)

4. 手写一个类(考察类的前置声明)

6. map遍历删除(考虑迭代器失效)

5、kill,强制退出以及两个不能被忽略或捕获的信号:SIGKILL和SIGSTOP

6、awk输出第二列数字的平均值

8、LRU cache的实现思路,主要采用链表和红黑树

9、大端和小端

1、linux的内存管理,保证多个线程访问同一块内存的访问安全

2、互斥锁和自旋锁

4、静态的多态(即模板)相对动态多态的优势,主要是运行时的性能较高

你可能感兴趣的:(C++,面经总结)