
大家好,我是阿秀。
昨天收到美团的官方招聘推送消息,发现美团已经正式开启今年的校招正式批招聘了,时间为 2024.7.29-2024.10.31,差不多为期三个月的时间,也就是说,美团的秋招补录预计会在 2024.11月后了。
这里聊一下美团这家公司,美团是一家非常有意思的公司,比如它是有名的 Java 大厂大厂之一,但对于其余技术栈的应届生也会招收,这一点跟其余几个 Java 大厂不同。
23 和 24 届有很多非Java技术栈的同学,比如 Golang技术栈 或者 C++ 技术栈的去面试美团,美团都给了面试机会,并且最终也有非Java技术栈的同学拿到了offer,前几天就分享过一位 Golang 技术栈的同学去面试美团的面经:美团实习面经分享
还有,美团这个公司发 offer 很积极,注意啊可不是一般的积极,远比其余同级别的大厂要积极,不管是23届,还是24届,美团都是第一个开奖的大厂,以前还写过文章聊过这个事:今年居然又是美团率先开奖....、今年又是美团在校招薪水上开了个好头。其中23届美团的薪资为主要为:
白菜价:21K*15.5 小SP:24K*15.5 大SP:27K*15.5 小SSP:29K*15.5 + 5W 大SSP:31K*15.5 + 签字费不明
24届美团的校招薪资为:
白菜价,21k,除去各种福利补贴之外的总包大概就是 21k * 15.5 = 32w; sp,24k,除去各种福利补贴之外的总包大概就是 24k * 15.5 = 37w; ssp,28k,除去各种福利补贴之外的总包大概就是 28k * 15.5 = 43w
今天分享一篇24届读者的美团一面面经,他就是 C++ 技术栈去面试的美团,最终也顺利拿到了美团的offer,他的一面很具有代表性,整体难度适中,整体考察知识广度和深度都有。
对了,对于这份面经中比较经典的面试问题,阿秀已经录入到去年开发的互联网大厂面试真题记录网站:InterviewGuide 中去了,这个网站是阿秀去年为了方便自己找工作而开发的面试网站,目前是开源状态,欢迎试用体验。

网址:https://top.interviewguide.cn/
目前支持按照行业、公司、岗位、科目、考察时间等查看面试真题,在面试前一天晚上看一下有很大概率会遇到第二天的原因
,截止目前已经有不少小伙伴遇到原题了,具体可以看下链接:2023年7月字节跳动后端研发岗面试考察题目Top10、局部性原理还真有用!
美团一面面经(70min)
1、简单介绍下自己?
balabalaba
2、你是学C++的?怎么想到要投美团了,不知道美团是Java技术栈为主吗?
知道,但我看美团官方招聘JD描述里并没有限制语言,而且应届生可雕琢性比较高,自己也接受转语言,C++在编程语言中算比较难的,自己对底层也感兴趣,有自信在短期时间内学会其余编程语言。(面试官给了我一个大拇指??)
3、push_back和emplace_back这两个函数知道吗?哪个性能好一些?
emplace_back通常在性能上优于push_back,因为它可以避免不必要的复制或移动操作。
push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素) 。而emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。
4、虚函数调用过程可以说下吗?
1、编译器根据对象的静态类型确定要调用的虚函数,并通过虚函数表中的偏移量找到虚函数的地址。
2、使用虚函数指针(vptr)访问虚函数表,并根据偏移量找到虚函数的地址,调用虚函数。
这种机制实现了多态性,使得基类指针或引用可以在运行时指向派生类对象,并根据对象的实际类型调用相应的虚函数。这样,即使通过基类指针或引用访问虚函数,也能正确地调用到派生类的实现。
5、内存泄漏是如何出现的?
一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定)内存块,使用完后必须显式释放的内存。
应用程序般使用malloc,、realloc、 new等函数从堆中分配到块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则这块内存就不能被再次使用,我们就说这块内存泄漏了。
6、程序的内存分区有了解过吗?
内存分区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区和代码区。如下图所示
栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限
堆:就是那些由 new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个 delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收
自由存储区:如果说堆是操作系统维护的一块内存,那么自由存储区就是C++中通过new和delete动态分配和释放对象的抽象概念。需要注意的是,自由存储区和堆比较像,但不等价。
全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量和静态变量又分为初始化的和未初始化的,在C++里面没有这个区分了,它们共同占用同一块内存区,在该区定义的变量若没有初始化,则会被自动初始化,例如int型变量自动初始为0
常量存储区:这是一块比较特殊的存储区,这里面存放的是常量,不允许修改
代码区:存放函数体的二进制代码。
7、如果智能指针出现循环引用,该怎么办?
弱指针用于专门解决shared_ptr循环引用的问题,weak_ptr不会修改引用计数,即其存在与否并不影响对象的引用计数器。
循环引用就是:两个对象互相使用一个shared_ptr成员变量指向对方,弱引用并不对对象的内存进行管理,在功能上类似于普通指针,然而一个比较大的区别是,弱引用能检测到所管理的对象是否已经被释放,从而避免访问非法内存。
8、LRU应该知道吧?是最常见的几种页面置换算法之一
最近最久未使用置换算法(LRU,least recently used) :每次淘汰的页面是最近最久未使用的页面
实现方法:赋予每个页面对应的页表项中,用访问字段记录该页面自.上次被访问以来所经历的时间t(该算法的实现需要专门的硬件支持,虽然算法性能好,但是实现困难,开销大)。当需要淘汰一个页面时,选择现有页面中t值最大的,即最近最久未使用的页面。
LRU性能较好,但需要寄存器和栈的硬件支持。LRU是堆栈类算法,理论上可以证明,堆栈类算法不可能出现Belady异常。
在手动做题时,若需要淘汰页面,可以逆向检查此时在内存中的几个页面号,在逆向扫描过程中最后一个出现的页号就是要淘汰的页面。
9、用户态和内核态有什么区别?
内核态:cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一个程序。
用户态:只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被剥夺,cpu资源可以被其他程序获取。最大的区别就是权限不同,在运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。
为什么要有这两态?
需要限制不同的程序之间的访问能力,防止他们获取别的程序的内存数据,或者获取外围设备的数据,并发送到网络,CPU划分出两个权限等级:用户态和内核态。
10、线程切换的时候有一个状态叫做堵塞状态,会因为哪些原因被堵塞?
阻塞状态(Blocked):线程因为某些原因无法继续执行,例如等待I/O操作完成、等待锁释放等。
11、POST 方法比 GET 方法安全,这句话对吗?
不对!有人说POST 比 GET 安全,因为数据在地址栏上不可见
。
然而,从传输的角度来说,他们都是不安全的,因为 HTTP 在网络上是明文传输的,只要在网络节点上捉包,就能完整地获取数据报文。
要想安全传输,就只有加密,也就是 HTTPS这一种方式。
12、既然提到了HTTPS,那你说下HTTPS解决了HTTP的哪些问题?
HTTP有三个问题:
发送的数据没有加密,可能被窃听 数据没有校验,可能被篡改 没有验证通信对方是不是冒充的
HTTPS解决问题:
1、混合加密解决窃听问题(服务器生成公私钥,公钥发送给客户端,客户端生成共享密钥,用公钥加密,发送给服务端,服务端用私钥解密,得到共享密钥,后面通信就用共享密钥加解密)
2、服务器用摘要算法计算出传输内容的哈希值(也就是指纹,这个哈希是唯一的,且无法通过哈希值推导内容),客户端收到后,也对内容进行哈希,如果两边哈希值相同,则没有被篡改
3、服务器把公钥注册到了CA,CA用自己的私钥对服务器的公钥进行数字签名,并颁发数字证书,客户端拿到服务器的数字证书后,用CA公钥解密,验证该证书的真实性,这样就可以防止有中间人对客户端冒充服务器,对服务器冒充客户端了
13、说一下三次握手的过程
三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。
进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息,主要状态如下:
初始状态:客户端处于 closed(关闭)状态,服务器处于listen(监听)状态。第一次握手:客户端发送请求报文将 SYN = 1同步序列号和初始化序列号seq = x发送给服务端,发送完之后客户端处于SYN_Send状态。(验证了客户端的发送能力和服务端的接收能力)第二次握手:服务端受到 SYN请求报文之后,如果同意连接,会以自己的同步序列号SYN(服务端) = 1、初始化序列号seq = y和确认序列号(期望下次收到的数据包)ack = x+ 1以及确认号ACK = 1报文作为应答,服务器为SYN_Receive状态。(问题来了,两次握手之后,站在客户端角度上思考:我发送和接收都ok,服务端的发送和接收也都ok。但是站在服务端的角度思考:哎呀,我服务端接收ok,但是我不清楚我的发送ok不ok呀,而且我还不知道你接受能力如何呢?所以老哥,你需要给我三次握手来传个话告诉我一声。你要是不告诉我,万一我认为你跑了,然后我可能出于安全性的考虑继续给你发一次,看看你回不回我。)第三次握手:客户端接收到服务端的 SYN + ACK之后,知道可以下次可以发送了下一序列的数据包了,然后发送同步序列号ack = y + 1和数据包的序列号seq = x + 1以及确认号ACK = 1确认包作为应答,客户端转为established状态。(分别站在双方的角度上思考,各自ok)
14、ACID了解吗?
ACID主要指事务四大特性即原子性、一致性、隔离性、持久性。
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
15、说下你理解中的MVCC机制
我理解MVCC就是多版本并发控制,实现了读写的并发控制,在mysql通过readview 隐藏字段和undolog实现了,比如在可重复读里面,比如开启了一个事务,就生成了一个readview,然后记录现在active的事务,判断查询的数据在这个事务可不可读。
16、手撕算法2道
两道很常见的题,一个是剑指offer的原题,一个是力扣面试题03.02
包含min函数的栈 二叉树的层序遍历
面试体验
整体面试大概一个小时10分钟左右,面试体验不错,不是单方面的询问,整体都有来有回,算得上是我秋招阶段面试体验最好的几家公司之一了,可以打 8 分了。

你好,我是阿秀,普通学校毕业,校招时拿到字节跳动SP、百度、华为、农业银行等6个互联网中大厂offer,毕业后先于抖音部门担任全栈开发工程师,目前在上海某外企带领团队继续从事全栈开发,负责对印项目。
前年和去年分享的很多校招上岸经验也都是出自阿秀的学习圈中的往届上岸人如21届、22届、23届等,阿秀的学习圈中置顶帖的「知识图谱」和「精华区」中有很多计算机大学本科&研究生学习以及校招的内容和问题,都是往届沉淀下来的瑰宝。

多看看这些能够帮你的校招之路走的更稳、更顺、更平坦,比如:
也会在自己组建的阿秀的学习圈中分享一些社招跳槽找工作的经验,都是自己一路走过来的经验。