2022/03/09 蚂蚁电话面试复盘
蚂蚁大安全部门实习生电话面试,第一次面试给了蚂蚁,感觉表现得不太好,复盘一波。
自我介绍
没有拿得出手的项目,有点僵硬,得加紧一下进度,3月份争取照着github上的webserver自己做一个出来。
C++
-
谈一下对面向对象的理解
这一块讲得一团乱,说出继承、封装、多态之后混在一起讲了,应该从这三者出发分别讲清楚,也是自己之前没有系统性地叙述过,脑子里有概念讲不出来。 -
提到了虚函数,讲一下C++是怎么实现虚函数的多态的效果
就是虚函数表以及指向类的虚函数表的指针,派生类覆盖基类的虚函数时会用虚函数表里对应的指针替换,这样调用的就是派生类里的虚函数。 -
构造函数可以是虚函数吗?
显然是不行的,要调用虚函数先要有虚函数表,指向虚函数表的指针要在构造函数里进行初始化,如果构造函数自己是虚函数就相当于陷入了一个死循环。 -
静态链接和动态链接的区别
这个我扯了一堆静态库文件和动态库文件的编写,还有编译的过程;其实看到静态和动态就应该想到编译期和运行期,静态链接就是在编译链接可执行文件的时候就把静态库文件链接到可执行文件里,动态链接则是在运行可执行文件的时候再去找要链接的内容;显然两边的优缺点就是静态链接运行起来快但是编译慢而且修改库文件很麻烦,动态链接编译起来快而且更新方便但是运行慢。 -
怎么设计不可以复制的类(《Effective C++》内容)
这个就是把拷贝构造函数和operator =赋值函数都定义成private函数就行了,外部无法调用。
STL
- map和unordered_map的区别
map的底层是基于红黑树来实现的,内部元素排列有序,unordered_map底层是用哈希表来实现的,元素无序。- 查找时间复杂度
map是O(logN),unordered_map平均是O(1),最差是O(N)。 - unordered_map最差复杂度O(N)是因为发生了哈希冲突,那么解决哈希冲突的方法有哪些?
撞到知识盲区了,查了一下有这么几种常用的方法:
- 开放定址法:一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。
- 再哈希法:顾名思义,冲突了就用第二个哈希算法,再冲突就用第三个,简单粗暴。
- 链地址法:将所有具有相同哈希地址的而不同关键字的元素连接到同一个单链表中。
- 建立公共溢出区:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。
- 查找时间复杂度
算法
-
介绍一下熟悉的排序算法以及时间复杂度
这个真是翻车了,本来应该讲得比较好才对的,结果有点没记得很清楚,讲得略乱,这里重新写一下,这些基本知识还是得常看常新。- 冒泡排序:O(N2),稳定
- 插入排序:O(N2),稳定
- 归并排序:O(NlogN),稳定
- 快速排序:O(NlogN),不稳定
- 堆排序:O(NlogN),不稳定
- 桶排序:O(N + k),稳定性依赖对桶内元素进行排序的过程
- 选择排序:O(N2),不稳定
- 希尔排序:O(N(logN)2),不稳定,插入排序的改进
- 计数排序:O(N + k),稳定
- 基数排序:O(Nk),稳定,桶排序的扩展
-
找出一组数中第5大的数字应该用哪种排序算法
显然是堆排序,建一个大小为5的小顶堆然后把所有数往里丢,堆超出大小了就把堆顶的元素抛出去。 -
讲一下快速排序的实现
这个还行,讲上来了,主要介绍了一下快排的思路,如果直接手撕代码可能会卡一下。 -
STL里面本身的sort()用了什么排序算法?
这个好久之前在知乎上看到过,但是记不太清了,就说上来根据元素个数不一样会选择不同的排序算法,有堆排序也有快速排序。查了一下,发现一共用到3种排序算法,分别是快速排序、插入排序和堆排序,在数据量较大时调用快速排序,分段归并排序,当分段后的排序区间小于16时会改用插入排序,而如果快排的递归层次过深就会改用堆排序。 -
讲一讲平衡二叉树
平衡二叉树的左右子树都是平衡二叉树,而且左右子树的高度差不能超过1。(这里先说成是一样的,大雾,还好改口了) -
层序遍历的实现
二叉树的经典算法了,这个说的应该是比较清楚的。
计算机网络
-
TCP和UDP的区别
基本上都说出来了,虽然可能有点乱,这里都整理一下。- TCP面向连接,UDP是无连接的;
- TCP可靠,UDP不可靠;
- TCP面向字节流,UDP面向报文流;
- TCP有流量控制、拥塞控制,UDP不管这些;
部分没说上的: - TCP是一对一,UDP支持一对一、一对多\多对多;
- TCP首部开销20字节,UDP只有8字节.
-
TCP的四次挥手
其实三次握手记得更清楚一点,不过也大概说出来了.- 客户端没有数据需要再发的时候,发起第一次挥手,告诉服务器数据发完了,发送FIN=1;
- 服务器接到后发送ACK=1,不过这时候服务器可能还有数据没发完,所以接下来还有;
- 服务器发完数据后再发送一个FIN=1给客户端;
- 客户端收到服务器发送的消息后回复ACK=1,这里有一个2ms的延时等待.
-
客户端2ms延时等待的意义?
客户端发过去的消息可能没被接收,服务器可能会重新发送释放连接状态的消息过来,这时候就要重新发送ACK=1保证服务器关闭,超出2ms后就认为服务器已经关了. -
HTTP里面除了GET和POST还有哪些常用的请求方法?
学的时候因为这一块之前不是考点,基本上都忘光了,没说上来.重新翻了一下,还有HEAD\PUT\DELETE\CONNECT\OPTIONS\TRACE\PATCH这些,这些都没咋背,hh.
操作系统
操作系统这块基本上处于还没咋看的状态,虽然之前看了一下《程序是怎么跑起来的》,但是对比了一下面经里经常出现的问题感觉那本还是太简单了,后面准备用CSAPP来学一下操作系统这块吧.
总结
面试官很和善,我自己倒是感觉有一堆没说好的点,还有好多知识盲区,最近也是有点懈怠了,博客好久没更新了,还是得酬勤起来啊,接下来准备在3月把webserver的项目初步做完,4月和5月学完操作系统,后面再看一下数据库结合数据库在6月再做一个项目,如果能实习最好,不行就靠自己做项目,博客重新写起来,加油冲!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)