蚂蚁-C++开发-一面 面经

1. 简单做个自我介绍,重点说说你的项目经历和技术栈。

答案要点:

  • 基本信息:学校、专业、预期实习时间
  • 技术栈:C++、数据结构与算法、Linux、数据库等
  • 项目经历:1-2个核心项目,突出技术亮点
  • 个人优势:学习能力、代码质量、问题解决能力
  • 对蚂蚁的了解和期望

2. 详细介绍一下你简历中的某个项目,包括技术选型、架构设计、遇到的难点和解决方案。

答案要点:

  • 项目背景:业务场景、用户规模、技术挑战
  • 技术架构:模块划分、技术选型理由、设计模式
  • 个人职责:负责的具体模块和功能
  • 技术难点: 性能瓶颈及优化方案并发问题及解决方法数据一致性保证异常处理和容错机制
  • 量化成果:性能提升、响应时间、资源占用
  • 技术沉淀:可复用的组件、文档、经验总结

3. 有一个100GB的文件,内存只有4GB,如何找出文件中出现次数最多的前10个数字?

答案:

  • 方案一:分治 + 哈希第一遍:哈希分桶,将数字hash到1000个小文件相同数字一定在同一个文件中第二遍:对每个小文件统计频率,维护全局Top10使用最小堆维护Top10,遍历所有文件的统计结果时间复杂度:O(n),空间复杂度:O(k),k为不同数字个数
  • 方案二:外部排序 + 统计外部归并排序将文件排序顺序扫描统计相邻相同数字的频率维护最小堆记录Top10时间复杂度:O(n log n)
  • 方案三:多路归并 + 在线统计将文件分块,每块排序多路归并的同时统计频率边归并边更新Top10

4. 设计一个近似算法,只读一遍文件就能近似找出出现次数最多的前10个数字。什么情况效果好?什么情况效果差?

答案:

  • Count-Min Sketch算法:使用多个哈希函数和计数数组每个数字映射到多个位置,取最小值作为估计空间复杂度:O(w * d),w为数组宽度,d为哈希函数个数只会高估,不会低估
  • Lossy Counting算法:维护一个计数器表,设置阈值低于阈值的元素定期删除适合找频繁项
  • Space-Saving算法(推荐):维护k个计数器(k=100,远大于10)新元素:如果在表中则计数+1,否则替换最小计数器最后返回计数最大的10个空间复杂度:O(k)
  • 效果分析:效果好的情况: 数据分布倾斜,热点数据明显Top10的频率远高于其他数字数据重复度高效果差的情况: 数据分布均匀,没有明显热点Top10和Top11-20频率接近数据种类极多,每个数字出现次数都很少

5. 详细说明外部归并排序的原理和实现步骤。

答案:

  • 基本思想:将大文件分成多个可以放入内存的小块对每个小块进行内部排序多路归并这些有序小块
  • 实现步骤:分块排序阶段:读取能放入内存的数据块(如100MB)使用快速排序或堆排序排序将排序结果写入临时文件重复直到处理完所有数据多路归并阶段:同时打开所有临时文件为每个文件维护一个输入缓冲区使用最小堆选择当前最小元素将最小元素写入输出缓冲区从对应文件读取下一个元素重复直到所有文件处理完
  • 优化策略:多级归并:如果临时文件太多,分多轮归并缓冲区优化:合理分配输入输出缓冲区大小预读:异步IO,提前读取数据压缩:临时文件压缩节省磁盘IO
  • 复杂度分析:时间复杂度:O(n log n)空间复杂度:O(M),M为内存大小IO次数:O(n log(n/M))

6. 手写代码:实现有向无环图(DAG)的深拷贝。

答案:

#include <unordered_map>
#include <vector>

// 图节点定义
class Node {
public:
    int val;
    std::vector<Node*> neighbors;
    
    Node(int _val) : val(_val) {}
};

class Solution {

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++八股文全集 文章被收录于专栏

本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。

全部评论
吸欧气,太卷了!
点赞 回复 分享
发布于 03-01 22:18 四川

相关推荐

收到了QQ部门的面试,昨天晚上面完,电话面试40分钟,无手撕,面试官非常友善,答不上来也会给你提示,给予充足的思考时间,感觉像是朋友间的聊天。1.开局自我介绍2.问了大概15分钟的项目(分布式系统一类的)3.问了一下是否了解过ai相关的技术栈(不了解)4.系统调用和库函数的区别?(我有点没想起来,然后提示了一下fwrite和write)5.关键字volatile有什么作用6.大端序小端序有什么区别(也想不起来了,只知道顺序相反)7.UDP包的最大长度8.讲一下三次握手的过程9.如果第三次握手ack包丢失但发送方又立马发送了数据会发生什么?10.static静态变量,如果写static&nbsp;int&nbsp;c,然后直接输出c的值是多少?11.设计题:如果有100万个学生的成绩,需要知道前top100,怎么去快速统计出来?(脑抽了没想到堆排序上来,前一天刚看过这道算法题,扯了一些其它排序,分析了下时间复杂度)12.场景题:有一个产品提了一个登陆模块的需求,希望同一个用户30分钟内如果重复登陆会给用户发一个提醒,怎么设计?(不知道,瞎扯了一下定时,token之类的)13.redis有哪些特性?性能的数量级有了解吗?腾讯云阿里云亚马逊的redis容量实力?14.热key大key是什么,怎么解决?15.vim编辑器怎么查找,命令是什么?16.后面就是闲聊了,问我最近有没有看什么技术文档,家是哪里的,未来的职业规划基本都是围绕简历上来问的,感觉是寄了,答得不太好
查看18道真题和解析
点赞 评论 收藏
分享
昨天 00:04
已编辑
吉林大学 Java
约面的挺突然。。狠下心接了1.自我介绍2.讲讲JAVA的反射3.可以继续讲讲AOP,动态代理[&nbsp;因为讲反射不小心吟唱到了例如AOP的动态代理,但是这块记忆的非常不熟,结果磕磕绊绊&nbsp;]4.项目我看你写了AOP和注解,具体怎么实现滑动窗口限流的[&nbsp;梦到什么说什么,吟唱八股发散千万不要散到自己不熟悉的区域&nbsp;]5.也讲讲为什么另一个项目选择令牌桶,具体流程6.&nbsp;OK,讲讲&nbsp;Redis&nbsp;的数据类型?还有吗?就了解这五种嘛[&nbsp;把5个的基础类型从应用对比到历届底层全都吟唱了一遍。一句还有吗直接没力气了,简历就写了理解5种,别的我是真一点没看TT&nbsp;]7.讲讲Redission分布式锁实现8.这个指数退避怎么实现的9.在这里有考虑去保障幂等性嘛10.这里为什么使用指数退避呢?&nbsp;什么时候用均匀重传[已经晕过去了说不了解,刚说了后就意识到,估计应该说指数退避能缓解压力防止下游服务器雪崩之类的]11.ok,那讲讲JMM12.讲讲RocketMQ如何保证的不丢消息13.讲讲RocketMQ延迟消息原理14.讲讲项目Redis实现会话记忆这一块15.如果ai调用function&nbsp;calling出现幻觉,有考虑怎么解决吗?[&nbsp;不了解,面试官说什么接口幂等化,高危操作人工防护,没在听,感觉人已经飞升了TT&nbsp;]16.mcp了解嘛?和function&nbsp;calling有什么区别[&nbsp;依旧不了解,只能说了个前者规范架构抽象解耦,后者耦合高只能算个工具调用]17.AI生成代码的代码质量怎么保障,那平时如何review的呢18.算法。lc215&nbsp;&nbsp;数组中最大第k个元素19.打算考研还是本科就业20.反问1️⃣有哪里不足,有哪些需要提高的部分。[主要说知识广度不够,多刷算法,让我别太紧张]2️⃣部门业务会做什么人生第二次面试。感觉大厂面试官的气场压力很大应该凉了不过这次面试非常锻炼心态,多面试,多面试。
Luxlord:面经太硬核了
点赞 评论 收藏
分享
评论
点赞
6
分享

创作者周榜

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