后端/C++面经,(已完结)
自我介绍一下,普通二本计算机专业大三本科生,退役ACMer。
刚开始投了好多小厂,想着先拿来练练手,谁知道小厂都被刷下来了。。。然后第一面就是百度
有一些答案写了出来,可能有错误或需要补充,非常欢迎指出。
百度C++岗位 2020.3-19
一面
- 自我介绍
- 大三可以出去实习吗?
因为我投的是校招简历。 - 简单的算法题---一个数组,找两个数之和等于一定值的下标。
用map建立了val-index的映射,O(nlogn)写出来的。因为没刷过leetcode,以为有O(n)的写法,最后浪费了2分钟想O(n)的解法。 - 什么是hash?,如何解决hash冲突。
说了下hash原理和rehash - 熟悉哪些排序? 快排的时间复杂度是多少?,最坏时间复杂度是多少?为什么?空间复杂度是多少?快排是稳定的还是不稳定的?什么是稳定排序?
- 熟悉哪些数据结构? (我说我都行)他说链表会吗?(我说熟悉,而且还熟悉跳表),来说说跳表,(跳表说的不好,以后再也不敢随便装了....)。
- 链表找环。
不知道快慢指针,没说到点上。在这里浪费了10分钟左右。 - 你们学的计算机网络是几层?(五层),都哪几层?传输层是什么?UDP和TCP的区别?如何实现可靠传输?TCP的三次握手?ask是干嘛的?HTTP在哪一层?说一下HTTP get请求和post请求,HTTP的get请求和post请求的区别?get请求的url的最大长度?
这里三次握手第一次说的有误解,后面再在面试官的提示下意识到错误重新说了一下。 - 进程和线程的区别?
- 进程间通信?
- 什么是死锁?如何打破死锁?
- mysql事务?
- 有什么问题要问的。
面了50分钟,总体来说比较满意,面试官很好(第一次面试前是很忐忑的,但是跟面试官聊起天来就一点不紧张的),问的也非常详细,很广泛。
回去把自己的坑给补了下 (快慢指针)
二面(与一面隔了一天)
二面是用微信语音面的,用腾讯文档打的代码。
- 介绍一下自己
- 大三可以出去实习吗?
- 说一下unorderd_map的大概实现?如何解决hash冲突?
- session和cookies的区别?
- 数据库mysql的两种引擎InnoDB和MyISAM的区别?
MyISAM不支持聚簇索引,不支持事务,不支持行级锁。 InnoDB支持事务,默认隔离级别是不可重复读,支持行级锁,但是不能显示的支持的Hash索引,可能会有自适应hash索引。 - 事务的特性?
- 设计模式熟悉吗?(呃呃,不熟悉,好像没开这门课) ,好,那你给我说下单例模式吧(额,不太会),你得好好补补设计模式,这个会有很多人问。
- 说一下项目吧?
我的项目好长时间没碰了,整体说的很差。给面试官讲了一下项目中用到的算法,另一个项目讲了下架构。 - 如果项目重构一下有什么想法?
说的不咋地。 - 打个代码吧,给出二叉树前序和中序遍历,求二叉树结构。
因为没刷过leetcode,之前也没做过。所以这道题是第一次做,所以也是第一次思考,好在有了思路,写了10多分钟做出来了。 - linux如何统计ip地址出现次数?
没答上来。 - 对所在的岗位熟悉吗?(不熟悉)
面试管给我解释了一下岗位主要是干嘛的, - 你对岗位有什么要求? (我们就一直在聊)
- 最近在看什么书?
- 有什么问题吗?(我问了下面试过程我有哪些需要补充,然后面试官给我了一些意见,我们又聊了一会)
这位面试官给我的印象特别深,给了我很多意见,很有帮助,也非常感谢他。面试时常总共是100多分钟。
回去里面就买了本Head First设计模式,补了补。以前眼拙以为设计模式没啥用就是一个架构思想,现在看来是真的神奇呀,非常重要。
重新翻起来老项目给扒了扒,并准备重构一下。
5天没通知了,看之前的情况而言感觉是凉了,不过从中学到了很多,也非常感谢前面的面试官给的经验。
3-27更--
发现校招简历投递状态变为请重新投递,实习生简历状态变为已通知笔试。(可能是我投的是2020校招的原因吧,实习生招聘再闯一下!)
腾讯2020.3-23
一面
介绍一下自己
c++指针和引用的区别?什么是构造函数?什么情况下会调用构造函数?
下面代码内存中会有几个"23"
string a="23" string b=a;
我回答的三个(补充:当时面试官主要想考拷贝构造函数那一块,所以我就想都没想就说了三个😅,如果string具体实现采用写时复制的话是1个,不过具体不太清楚...)。
const是干嘛的?const & 有什么优势?(速度快点),为什么会快? 如何在下面代码中修改const string & 类型的值?(用const_cast<string &>,补充:也可以用取地址然后强制转换对应指针再操作)
虚函数是什么?怎么实现?是运行时决定还是?
编译器编译代码的过程?
之前看过CSAPP,就把先把宏展开,编译,静态链接过程说了一下。就差不多了。UDP和TCP的区别?流量控制如何实现?为什么要time_wait?
如何去除套接字的time_wait的状态?(setsockopt函数)
epoll和select区别? (说了下select移植性高,epoll性能方面好点) 为什么epoll性能比select好 ?(主要说了下epoll和select 传参的过程,epoll相当于可持久的)
这个感觉说的不太好。进程和线程区别?为什么进程切换快?进程切换和线程切换有什么不同?线程都共享什么?
进程间通信?
mysql索引方面InnoDB和MyISAM的区别?
下面代码用了几个索引?
//假设tablea中在name建立了个索引。且name不是聚簇索引 select name from tablea where name...//比较操作
一个,因为查询过程对于name是覆盖索引。
写sql语句。
写个代码吧,序列有n个数,第i个数代码第i天买(卖)股票所需要(获得)的钱,只允许买卖一次,输出最优买卖天数的索引?
很快就写完了,并讲了下思路。然后嘴贱的我多说了一句,这题太简单了(以后发誓再也不这样了)。输入一个表达式字符串,输出结果。像这样的
1 > 2 || 3 < 4 && 5 < 10
GG。一眼表达式求值,但是表达式求值好久没写过了,感觉得写30多分钟而且不一定能写出来。就假设条件中 字符串用|| && 隔开的只是个 a > b只类的。然后就开始写了,到最后也没写出来,不过也快了。牛客编译器运行一直不出结果,也调不出来Bug。面试官说没事你给我说下思路吧,我说了下,并且面试官给出了代码的一些见解。
获奖经历?
有什么问题要问的吗?
感觉腾讯问的特别细,挖的也很深,其中也发现了自己的薄弱点,比如(epoll和select性能之间,进程线程切换的内容是什么?)。面试时长是90分钟,应该是过了。
3-25号,现在还没收到腾讯二面的通知。不过也算是给自己时间去补项目经历了。
3-29号,发现流程变灰了,我真感觉自己面的不错呀。
字节(未)
3-26更,没有任何通知发现被调到深圳的C++客户端开发--飞书岗位了。
4-9 都被刷了,没希望了。
百度C++暑期实习生(4-25)
一下午直接三面,现在等oc
一面
- 设计一个百度搜索引擎如何设计?
- 如何把我的项目改成网络版的?
- TCP与UDP区别
- 查找当前目录下修改时长距现在1h之内的所有文件(考察find命令-mmin选项)
- 端口扫描工具(nmap)
- 硬链接与软链接区别?硬链接链接文件夹会有多少个硬链接(这应该是个坑,硬链接只能链接文件,不能连接文件夹)
- 写题,给出一堆ip地址,找出ip地址出现次数最多的ip?
- 写题,n个ip地址中找出出现次数大于n的一半的ip地址?
Linux命令回答的不太好,其他都还行。
感觉很简单,跟之前面的不一样,这一次基础问的很少。
二面
- 讲一下我的项目
- 写下项目中某个功能的实现
- mysql如何查看语句的执行效果,如何优化索引(explain命令和索引优化)
- 讲一下跳表
- 讲一下redis持久化
三面
聊天
- cpu都由什么组成呀
- 喇叭如何发生呀
- 液晶屏幕如何显示彩色呀
- 有没有压力大的事情呀
5.22更,百度状态显示未通过
唉,真是难受。
腾讯5.11
一面
- 右值引用
- dijkstra算法
- kmp算法
- 好多忘了,想起来立马补
二面
- 熟悉vector和list吗,讲一下对应的内存分配策略,讲一下插入时间复杂度。
- 讲一下TCP四次挥手和time_wait状态
- 如果有一个服务器,每秒接受9亿个请求,而现在网络中很多客户端都是time_wait状态,是什么状况?
面试官说是正常状态,但是我回答的时候过程可谓是非常坎坷。我:如果服务器认为每秒9亿个请求是正常的话,那就是正常状态,因为客户端连接结束后都会进入time_wait状态,但是如果每秒9亿个请求不正常,那就可能可能有恶意连接,比如一个电脑,恶意将所有端口都去连接服务器。
面试官:为啥是正常状态呢?
我:因为每个客户端连接后断开就会进入time_wait状态,这个状态会持续2MSL时间,大概2分钟(注意,这个时间我不太确定,其实不应该说)
面试官:为什么是2分钟,你在哪看的?
我:呃呃呃,记得不太清楚了,反正是30秒以上,挺长时间的,在谢希仁那本书看的。
面试官:那回到这个问题,现在是什么状态呢?
我:客户端连接套接字进入time_wait状态,这个套接字在一定时间内就不可用了呀。
我:对还有可能,是服务器收不到第四次挥手,所以就一直像客户端发送第三次挥手,导致客户端不能退出time_Wait状态。
面试官:客户端不是只有一个套接字进入time_wait状态,是很多端口都进入time_wait状态。
我:可能遭受DDOS攻击了吧(这里我对DDOS攻击的理解是大量的请求,但是我不熟悉DDOS,其实不应该说)
面试官:你知道什么是DDOS攻击吗?
我:呃呃呃,不太清楚,但大概意思就是客户端恶意像服务器发送连接请求,导致服务器宕机,
面试管:现在没有遭受攻击。
我:我不知道,你说吧
面试官:其实是正常状态
我:那为啥一个客户端很多端口都time_wait呢?
面试官:那是因为它重启了
我:。。。
一个简单的正常状态,被面试官反问到我怀疑人生
- 如果套接字进入time_wait状态,该如何处理呢?
我:使用setsockopt函数
面试官:你给我打出来?
我:(输入框打这个函数)
面试官:使用套接字的什么属性
我:忘了,但我之前用过,一般这个东西我要看文档。
面试官:还有什么方法
我:呃呃呃,等一会就行了,因为time_wait状态会自动清除 - 讲一下程序的编译和连接
我讲了宏绽开、翻译到汇编文件.s、再到重定位文件.o、然后动态链接和静态链接bababababa - 做一个算法题:二分找有序数组的某个数出现位置,
我:如果多个出现是最左边还是最右边
面试官:左边
我papapa开始写,但是好久没写出了点问题,大概20分钟,然后被面试官说代码能力不行,身为acmer真的惭愧。
然后面试官说有个样例不行呀,我一看,数组无序。
我:你数组无序呀,
面试官:呵呵呵,你这代码不行呀,边界问题没考虑,你都没判断数组有序没,还没判断我要是输入个字符串咋办。
我:呵呵呵 - 再给你一次机会,算法题:给出一串字符串,由许多单词组成,让你用O(1)的空间把单词位置反转,如 who are you 翻译成 you are who
我想了想思路,开始在牛客网编译器上敲,敲了大概10分钟,敲完了,然后我准备测试一下,重点来了,我输出测试结果printf("res:\n",s);
牛客编译器也没显示编译信息,我就直接运行,然后就啥都没输出,我以为哪里有bug,找了10分钟发现%s没写,槽!!!!
面试官:你这代码能力不行呀,时间太长了嗷,
面试官问我有没有问题,我说没有问题(当时已经不报希望了)
面试管问了我两个问题,问如何做到大三实习六个月以上的?学校让出来吗?
总之:面试发挥很糟,不该错的地方错了,就如二分,一般情况核心代码我一分钟就能写出来。这次一直考虑< 还是<= 还是> 然后先分左边还是右边,唉主要是太长时间没写二分了,而且这次脑子还抽筋了。还有面试官的反问,让我怀疑自己的观点。
三面
全程讲我新写的项目
问如果让我设计一个简单的服务器框架如何设计
这个问题当时不太清楚,就随便说了一下说的不好,现在想来,可以传入一个对象,这个对象是实现了一个抽象类并要求实现接受套接字函数
读取数据函数
写数据函数
断开连接函数
被动断开连接函数
然后必须在主程序中执行框架的run方法,去激活事件循环。
hr面
5.22,今天hr面试。
希望能过呀!!!!!!(感觉还是有点玄,因为三面没有多说什么)
5.26号更新----------拿到实习offer了!!!
等网易
一面
- 讲一下虚函数,子类和父类的虚函数表是一个虚表吗
当时回答错了。。。不是一个虚表,请看:C++中虚函数、虚继承内存模型
- 一个空类占多少字节,如果这个空类有虚函数呢?
- 如何申请内存使得内存的首地址是16字节对齐?
- vector和list的插入时间复杂度和扩容机制。
- 熟悉sort吗?写一下sort
- 一个文件每行有一个字符串,如何对这个文件中字符串去重。如果这个文件很大不能放到内存呢?(hash到多个文件中,分别去重)
- tcp如何做到可靠传输。
- redis list是如何实现的
- redis持久化的几种方式,AOF持久化过程中如何做到服务器继续响应请求
- redis子进程进行AOF重写时,父进程有写操作时,此时会怎么样?
- redis持久化过程中,子进程读一个内存数据,父进程写这个内存数据,会有冲突吗?(子父进程在页面方面执行写时复制)
- HTTP get请求与post请求区别
- linux 查看进程的几个命令(ps aux 与 top)
- linux 查看本机端口有哪些服务的命令(netstat和nmap)
计蒜客
这个面试的发挥的极差,因为好久没写算法了,代码能力下降太多。。。。
- 聊天
- 拥塞控制如何实现
- 给一个n*m的矩阵,通过螺旋将矩阵元素读成一列
如 n = 3, m = 4
1 2 3 4
5 6 7 8
9 10 11 12
输出:1 2 3 4 8 12 11 10 9 5 6 7 - 给出一个平面的两个矩形,求矩形相交面积
答案:两个矩形水平线段的相交长度 乘以 垂直线端的相交长度
结束
春招到此结束,去腾讯IEG 技术运营部门实习了。
#暑期实习##百度##腾讯##字节跳动##面经##校招##C++工程师#