金服,微软,腾讯,字节,美团,华为,网易互娱实习面经
😂三月份被腾讯挂了两次以后,然后同时等微软offer审批,可以说都是最难熬的时候,不过终于都上岸了,前来还愿。
1、首先是蚂蚁金服,base杭州,技术风险事业部,岗位是C++开发,据面试官介绍是做SRE的工作。优点是可能对技术成长提升比较大,但是比较累。
2、苏州微软好像是做Sharepoint这一块?优点是不加班,然后微软的技术沉淀应该也比较成熟,就是可能技术栈会比较窄一些?
3、腾讯是pcg看点的搜索推荐,优点是后台开发和自己的职业规划比较符合,缺点是....听说PCG这个事业群比较...emmm
4、字节是抖音桌面客户端开发,优点是字节现在还处于扩张期,可能后续成长空间比较大,缺点就是客户端开发和自己的职业规划不是特别符合
【update 5.13】更新了美团、华为、网易互娱的面经
字节跳动 桌面端开发面经
一面
1.介绍C++的新特性
2.我回答了智能指针,要求介绍四种智能指针
3.介绍shared_ptr原理
4.介绍weak_ptr的原理,为什么是弱引用(自己挖的坑)
5.介绍auto,主要是会覆盖顶层的引用和修饰。
6.如果要保留顶层的引用和修饰要用什么?decltype
7.给一段代码 const修饰相关 找错
8.手写一段代码 找出一个数组中超过一半的数。摩尔投票算法。
9.一道智力题,8个赛道,64匹马,要选前4,需要多少轮。
2.我回答了智能指针,要求介绍四种智能指针
3.介绍shared_ptr原理
4.介绍weak_ptr的原理,为什么是弱引用(自己挖的坑)
5.介绍auto,主要是会覆盖顶层的引用和修饰。
6.如果要保留顶层的引用和修饰要用什么?decltype
7.给一段代码 const修饰相关 找错
8.手写一段代码 找出一个数组中超过一半的数。摩尔投票算法。
9.一道智力题,8个赛道,64匹马,要选前4,需要多少轮。
二面
二面问题:
1.知道虚函数表指针在内存中是怎么分布的吗?(我直接按照Lippman那本书回答)。
2.虚函数表指针放在头部和尾部的好处分别是什么?(自己挖的坑。。)
3.size of a base class and a derived class 类似的问题
4.怎么判断两个线段相交?(叉积)
5.二叉树层次遍历(不用递归)?我是用queue做,比较直观
6.一个无序数组,求左右任意两个元素的最大差值?遍历,用一个leftmax保存左侧最大元素,每次和当前元素做差即可
7.智力题,1-100,报号,每次剔除奇数位置的人,问这样剔除以后最后剩下的是几号?64
1.知道虚函数表指针在内存中是怎么分布的吗?(我直接按照Lippman那本书回答)。
2.虚函数表指针放在头部和尾部的好处分别是什么?(自己挖的坑。。)
3.size of a base class and a derived class 类似的问题
4.怎么判断两个线段相交?(叉积)
5.二叉树层次遍历(不用递归)?我是用queue做,比较直观
6.一个无序数组,求左右任意两个元素的最大差值?遍历,用一个leftmax保存左侧最大元素,每次和当前元素做差即可
7.智力题,1-100,报号,每次剔除奇数位置的人,问这样剔除以后最后剩下的是几号?64
三面
1.问了项目经历,比如QT5的一些机制,控件等等
2.多线程的一些问题,一些IO模型
3.生产-消费者模型,伪代码,用条件变量,注意使用while()替代if()判断是否满足条件
4.IO多路复用epoll相比select的优势
5.二叉树 某一层的节点个数(递归)
6.一个比较繁琐的开发流程 怎么处理(感觉在问团队开发经验)
2.多线程的一些问题,一些IO模型
3.生产-消费者模型,伪代码,用条件变量,注意使用while()替代if()判断是否满足条件
4.IO多路复用epoll相比select的优势
5.二叉树 某一层的节点个数(递归)
6.一个比较繁琐的开发流程 怎么处理(感觉在问团队开发经验)
总结
总体而言,字节面试偏向于语言特性多一些,虽然总体是国内大厂风格的面试,但是面试官都比较年轻,也比较nice,面试的时候像是在讨论问题🤣。面试体验比较好,因为流程走的特别快,我是1月初面试的,基本上当天面完就有反馈,预约下一次面试
苏州 微软
一面
设计题:系统有时会记录CPU负载的变化,要求设计一个方法,返回当前时间5分钟内的平均负载(也就是负载总和/5分钟内的记录数)
在自己的IDE上写主要的方法即可
一开始的想法是:设计一个双向链表,每次记录就往链表头插入一个新节点。然后数平均值也就只要求从链表头开始5分钟以内的所有节点记录的和,再除以节点数即可。
Q1:时间要怎么表示好
我回答是时间戳,也就是从1970年1月1日开始的秒数
Q2: 还能改进吗
回答是因为只要记录5分钟内的值,所以每次涉及数据操作就从链表尾部开始往前依次删除不合格的节点。
Q3: 再进一步改进
把双向链表替换为双向队列deque
设计题问完后,问了个设计模式有关的,我回答用过单例,所以手写了一个scott meyers的单例模式(静态局部变量)
lead面
问了一些基本的C++知识点
(1)重载和重写的区别
(2)抽象类和接口的区别
(3)参数ref和out的区别
然后做题,题目不难,即经典的two sum问题,但是对个人理解要求很细,首先让我看给出的example,让我提问(比如是否存在重复数字,答案是否可以有重复值)。
1、给出思路(1.哈希表,2.双指针)
2、给面试官逐行讲解。
3、让我封装成函数,并自己给出测试用例,主要考察一些边界情况,大体都说出来。
4、还问了一下怎么不用工具检测内存泄露?考虑一会没想出来,面试官说直接写个loop跑几天即可(出乎意料地朴素。。。)
(1)重载和重写的区别
(2)抽象类和接口的区别
(3)参数ref和out的区别
然后做题,题目不难,即经典的two sum问题,但是对个人理解要求很细,首先让我看给出的example,让我提问(比如是否存在重复数字,答案是否可以有重复值)。
1、给出思路(1.哈希表,2.双指针)
2、给面试官逐行讲解。
3、让我封装成函数,并自己给出测试用例,主要考察一些边界情况,大体都说出来。
4、还问了一下怎么不用工具检测内存泄露?考虑一会没想出来,面试官说直接写个loop跑几天即可(出乎意料地朴素。。。)
总结
微软的面试,只能用两个字来说:舒适
面试官真非常非常nice,可能和微软的整体工作氛围有关,语气非常舒服,像是真正在和你进行平等交流,面试过程是循序渐进的,对你每一个阶段的回答都会进行鼓励式的回应,所以面试时候会感觉特别(蜜汁)自信🤣
两次面试都是全中文,lead面时候问过是否要用英文自我介绍,面试官也说不用。遇到的问题都不难;面试结果反馈也比较迅速,3.10面完,3.13就收到通过邮件。就是offer审批比较煎熬,等了将近一个月。
蚂蚁金服 SRE
因为金服都是电话突击,所以记忆比较模糊,就大致写下面试的方向把。。
一面
主要面试内容是简历问答(15分钟),一些C++的基础知识(大概介绍一下虚函数?)、操作系统(进程、线程)、数据库(问的比较少,因为我回答接触不多)
二面
二面是我印象中发挥最好的一次,体验也非常好,面试官是个组长级别的(大概),先问完简历,操作系统方面,问了我linux的一些基本指令,然后我回答里包含了ps,所以又问了ps的底层实现(我按照自己的理解,讲了一下PCB的机制,然后说大概是扫描了一下PCB的链表,面试官好像挺满意的)。
又问了我C++了解的最新特性(最新版本),我回答了C++20里的协程,所以又问了我协程相关的东西,包括内核线程和用户态线程之类的。
然后还问了些关于redis的东西,我说一个项目和redis有异曲同工之处,引起面试官兴趣🤣,还问了我redis分布式是怎么实现的,刚好最近有在看redis的东西,也比较顺利地回答上来了(集群、复制、数据转移、命令传播)
最后提问环节很耐心地和我介绍了他们的主要业务,面试官人真超级nice
三面
一开始我以为是lead面,但还是电话突击,没有预约....基本全在围绕简历在问,让我还以为不是lead面...
hr面
聊了一下基本的情况,职业规划之类,问我女朋友在哪(我回答没有,hr直接笑了说你们怎么都回答没有🤣),原本以为阿里的hr面会很难。。但是hr和我说笔试结果不错(虽然我2题只AC了一题..)几次面试的结果评级到A(出乎意料),一定会有offer,所以后面也不会有额外的交叉面了。。。总体还是比较轻松的,就聊了10分钟。
总结
可能是部门原因,金服的4次面试都是电话突击。。。阿里的面试也非常的“大厂范”,总体而言不会向阿里云那样“全栈”,但是对于数据库、操作系统方面还是会有所涉及,所以知识的广度也比较重要。另外可能是因为笔试过了的原因,几乎没有怎么考察编码能力。
腾讯 ieg + pcg两次
IEG
ieg我是找的学长组内内推,所以很快就被电话突击了。。。而且是在我午睡的时候(虽然已经3点多了)打过来的,当时整个人处于精神恍惚状态,回答的非常不好。主要谈了一些操作系统方面的东西,比如关于栈溢出,运行期还是编译期之类。然后算法题是两个排序数组,找中位数。我回答了lc上的O(log M +N )的最优解方法,但是当时脑抽了,问我时间复杂度我竟然回答了O(N)
10分钟后官网流程就变灰了
PCG第一次 一面
1、 介绍一下数据库索引(B+树、哈希索引、LSM树之类)
2、 一道SQL题(涉及到多个表,没答完整)
3、 IO多路复用介绍(select、poll、epoll)
4、 介绍select和epoll的区别(可移植性、最大监听数目、效率)
5、 进程间通信(IPCS)
6、 一个检测试剂10分钟检测一位病人,工厂有1000人,最少多少支试剂能10分钟内检测出来哪一位患病?讲出原理(小猪喝水问题的变种,
2、 一道SQL题(涉及到多个表,没答完整)
3、 IO多路复用介绍(select、poll、epoll)
4、 介绍select和epoll的区别(可移植性、最大监听数目、效率)
5、 进程间通信(IPCS)
6、 一个检测试剂10分钟检测一位病人,工厂有1000人,最少多少支试剂能10分钟内检测出来哪一位患病?讲出原理(小猪喝水问题的变种,
每一个试剂能携带两个比特位,相当于二进制中的一位,所以只需要10支即可.因为2^10 = 1024.具体检测方法就是每支试剂检测对应比特位为1
的所有病人,最后能确定哪些比特位是1,哪些是0,就能确定唯一编号了)
7、 40E个数,找出唯一不存在的数?
8、 对问题7的(内存)优化?大数据问题都是用哈希表进行分组,每一组做一次遍历,就可以大大减少内存占用
9、 算法题:1~N,其中有两个数重复,找出重复的数?
10、 简述TCP协议(三次握手、四次挥手)
11、 讲下点开一个网页发生了什么?(http请求、服务器响应、浏览器解析并渲染、再断开连接)
8、 对问题7的(内存)优化?大数据问题都是用哈希表进行分组,每一组做一次遍历,就可以大大减少内存占用
9、 算法题:1~N,其中有两个数重复,找出重复的数?
10、 简述TCP协议(三次握手、四次挥手)
11、 讲下点开一个网页发生了什么?(http请求、服务器响应、浏览器解析并渲染、再断开连接)
一面体验很不错 面试官也评价我说回答的很好,会很快安排二面,当时信心爆棚🤣
PCG第一次 二面
腾讯pcg 二面 一个半小时
1.介绍项目
2.问遇到过什么最大的困难
3.介绍多态和虚函数
4.写个单例模式的例子
5.为什么要区分内核和用户态
6.linux怎么管理进程内存?
7.怎么快速定位linux下占用资源很大的程序单元
8.设计题,快速找出所有微信关系里的单向好友
9.算法题,比如一个字符串ajxnhdbdosjbsorange,模式“o*ge”,找到匹配的最小字符串下标范围。
1.介绍项目
2.问遇到过什么最大的困难
3.介绍多态和虚函数
4.写个单例模式的例子
5.为什么要区分内核和用户态
6.linux怎么管理进程内存?
7.怎么快速定位linux下占用资源很大的程序单元
8.设计题,快速找出所有微信关系里的单向好友
9.算法题,比如一个字符串ajxnhdbdosjbsorange,模式“o*ge”,找到匹配的最小字符串下标范围。
果然人不能太骄傲,二面遇到了一个非常认真的面试官,每个问题都问的非常深,感觉自己全程非常无助,就像一个出的不肉的T,全程被ADC追着打。。。面试时间长达一个半小时,算法题面试官不满意我的解法,设计题也是处于半解答的状态。。
这次系统流程走的很慢,大概10天后终于灰了。。这段时间心情一下就低落了非常多。。
PCG第二次 一面
没想到又被PCG捞了 这次面的时候一开始报的希望也不是很大;一面的面试官直接说要一个会C++的,所以很多问题都和C++有关
1、介绍一下多态和虚函数
2、做题,一个基类,一个派生类,三个实例parent* p = new child;parent *pp = new parent;child *cp = new child;一个虚函数func,问三个实例分别打印什么;同时找错(基类析构要是虚的)
3、做题,一个类里面有另一个类的静态成员对象,两个类构造都会打印;也是问打印结果
4、set、map的底层实现,查找的时间复杂度
5、数据量更大时候用什么更好(unordered_map)
6、hashfunc一般怎么实现(除法散列,乘法散列 等等)
7、hashmap发生冲突怎么解决(链表法、开放寻址法等等)
8、1亿个数怎么找中位数(哈希分组,然后快排寻找)
9、手写一个单例模式,写了scott meyers的magic static,然后问了下一般懒汉模式怎么实现(双重检查加锁)
10、做题,一个周期性符号翻转的绝对值递增的数列,求前N项和(直接用等差数列公式)
2、做题,一个基类,一个派生类,三个实例parent* p = new child;parent *pp = new parent;child *cp = new child;一个虚函数func,问三个实例分别打印什么;同时找错(基类析构要是虚的)
3、做题,一个类里面有另一个类的静态成员对象,两个类构造都会打印;也是问打印结果
4、set、map的底层实现,查找的时间复杂度
5、数据量更大时候用什么更好(unordered_map)
6、hashfunc一般怎么实现(除法散列,乘法散列 等等)
7、hashmap发生冲突怎么解决(链表法、开放寻址法等等)
8、1亿个数怎么找中位数(哈希分组,然后快排寻找)
9、手写一个单例模式,写了scott meyers的magic static,然后问了下一般懒汉模式怎么实现(双重检查加锁)
10、做题,一个周期性符号翻转的绝对值递增的数列,求前N项和(直接用等差数列公式)
PCG第二次 二面
没想到二面就是lead面,这一面比较考察代码风格和基础
1.手写string类(要求把构造、析构、拷贝构造、拷贝赋值都写好,并考虑一些特殊条件如自我赋值)
2.手写链表合并,从创建链表到合并,main里面输出(链表也自己实现)
3.概率题,54张牌,分三堆,大小王在同一堆的概率
4.两人抛硬币,A先手,谁抛硬币到正面就赢了,问谁赢的概率大,概率是多少
1.手写string类(要求把构造、析构、拷贝构造、拷贝赋值都写好,并考虑一些特殊条件如自我赋值)
2.手写链表合并,从创建链表到合并,main里面输出(链表也自己实现)
3.概率题,54张牌,分三堆,大小王在同一堆的概率
4.两人抛硬币,A先手,谁抛硬币到正面就赢了,问谁赢的概率大,概率是多少
hr面
也还是一些基本情况,然后问了个人的职业规划,优缺点之类,腾讯的hr姐姐声音还是很好听的😂
总结
腾讯反反复复被捞了三次,历经波折,最后一次终于如愿以偿。。这次经验告诉我,一定不能盲目自信,还是要打好基本功。。。
美团金融 风控(两面)
一面
因为美团这里主要的技术栈是Java,所以没怎么问C++的问题,主要是一些非常基础的知识点
因为项目有用到redis,所以也问了一些Redis的问题
1、介绍一下Redis的基本数据类型(String、Hash、LIST、SET、ZSET)
2、介绍ZSET的底层实现(ZipList和SkipList)
3、介绍一下Redis的哨兵和集群功能
4、进程和线程的区别
5、死锁的概念
6、如何避免死锁、如何预防死锁(预防死锁就是那四个条件破坏任一,避免死锁则是银行家算法)
7、手撕快排
8、介绍多态、封装和继承的概念
Lead面
一面后一小时就进行Lead面,主要围绕项目做一些介绍
1、设计一个计算器类,要求能进行基本的二元运算(加减乘除),且以后可以扩展其他运算,如何设计(用装饰器模式即可)
2、介绍一下关于面向对象看过什么书
3、介绍一下自己的特点,优势,缺点
4、介绍一下职业规划
5、问是否可以转java
总结
lead面后大概2小时就接到了hr的电话谈薪。。。总体来说,美团面试相对是比较简单的(可能因为我是C++的技术栈的缘故)
华为-智能车云(两面)
一面
1、围绕项目做一些介绍
2、手撕代码:一个字符串,比如abc123/f/ecd,连续的数字或者连续的字母,或者反斜杠后和后面一个字符,视为一个整体,反转之。比如这时输出应该是cd/e/f123abc.(一开始用了栈来做,非常简单。然后面试官问有没有其他方法,我就说一个先分段反转再整体反转的原地做法。。面试官竟然说这种方法很少人能想到 - -)
Lead面
1、简历介绍
2、围绕简历中涉及到的知识,谈了redis的集群相关
3、谈谈认为的华为的优点和缺点
4、谈谈对于华为结果导向的看法
总结
华为面试总体是比较简单的,主管面感觉是和hr面结合起来了,更多是一些价值观的考量。
网易互娱-游戏研发工程师(一面)
一面(55分钟)
1.C++中,类的哪些成员函数是会自动生成的(构造、析构、拷贝构造、拷贝赋值操作符)
2.C++中,类的哪些成员函数必须自己定义(只回答了析构和拷贝构造)
3.C++的RVO机制了解吗(返回值优化)
4.C++,要自己实现一个Hash,怎么解决冲突(链表法、开放寻址法、完全散列法)
5.开放寻址法要如何查找一个元素(我回答先用hashfunc定位bucket,找不到对应的key就继续往后找...但好像不是很满意)
6.讲讲TCP和UDP的区别(老生常谈了)
7.讲讲一个程序从磁盘中到内存进程中运行的过程(操作系统的内容)
8.讲讲TCP KeepAlive(保活机制,即心跳包)
9.为什么喜欢在应用层定义KeepAlive而不用TCP协议栈中自带的?(我回答更灵活,可以自定义配置比如消息类型,时间间隔,接收后的处理)
10.讲讲非阻塞socket(老生常谈系列)
11.讲讲TCP_Nodelay 和 TCP_quickack(只回答了Nodelay即关闭nagle算法)
12.一个无序数组,如何寻找第n大的数(BFPTR算法)
13.一个场景题(虽然回答的不是很好...)
总结
网易互娱一面完就OC了(甚至没有hr面),总体来说,互娱面试流程比较短,但是问的内容几乎也是偏全栈的,范围甚至比AT之类的大厂更广些。不过
没有lead面还是有些不适应(哈哈
最后写下先前做的实习准备把
1、刷题,算法能力肯定是很重要的一块,所以我从去年大概3、4月份开始,leetcode上平均每天做3~4题,有时候是5题,easy、mid、hard比例1:3:1,一年坚持下来刷了910多道。大厂很多时候考察算法,实际上都是考察你对某个问题的理解能力,说白了,刷题能够让你掌握更多的trick,在同样AC的情况下“条件反射”出比较优的解,同时对于你的编码水平也会有很好的提升
2、看书,因为我的方向是C++,所以只介绍C++方向准备的一些书籍。首先值得回顾的肯定是《C++ Primer》,注意不带Plus。这是一本C++的工具书,虽然基础,但也很重要,书本的作者本身就是C++委员会的人,而且也涵盖了C++11的特性,是非常好的,能够了解C++全貌的书籍。其次是《C++ 标准库》第二版,这也是一本工具书,虽然很厚,但其实阅读起来很快,大概1~2周的时间每天阅读2个章节可以看完,这本书的目的在于对STL有一个全局的了解。接下来C++要进阶一定少不了大师Scott Meyers的作品,大多都是由侯捷老师翻译,包括《Effecitive C++》,《More Effective C++》,《Effective Modern C++》,功利的角度说,大厂围绕C++特性的问题无外乎出自这几本书之中,而同时我们又能借助大师的眼光对C++的很多实现细节有一个全面的了解。除此之外,Lippman的《深度探索C++面向对象模型》也是必备的一本书,其涵盖了C++面向对象的整体思路,并对许多概念有了深度的解析,特别是关于虚函数的部分,功利地说几乎是“必考题”,其又能很好地加深我们对于C++面向对象编程的理解。除此之外,《STL源码解析》不失为一本进阶的良书,若对泛型感兴趣,也有专门的书籍有所介绍。
补充一点,为了学习设计模式,我也买了著名的《Head First》,虽然里面的编码基础都是Java,但设计模式作为一种思想,无论是C++还是Java并不是关键。
3、额外的知识补充,包括网络编程、操作系统和数据库方面,这些数目在牛客上一个很火的面经里都有介绍,这里还是重复提及一下,《Unix网络编程》、《Unix环境高级编程》、《图解http》、《TCP IP详解》卷一、《现代操作系统》,其中网络编程这一块因为以前项目中均有接触,所以进度会快一些,而操作系统涵盖的知识面比较广,比较重点的部分包括:存储机制、进程/线程 这两块,这两个部分对于我们理解计算机程序是如何运行的非常有帮助,也是面试常考点,值得深入学习。而在数据库方向,因为我只接触过一些Redis的部分,所以只看了《Redis设计与实现》一书,这本书写的非常好,言简意赅,Redis一般也是面试中的加分项。通常,数据库不会是面试的必备储备,当然有所了解更高(可惜我就不太了解SQL)
4、关于如何学习。计划很重要,从去年10月开始,我正式开始所谓的“刷书”,尽管内容非常多,但是预先按照计划,把每天的进度安排好,实际上一本书只需要花费1周多一些的时间就能“刷完”。当然,我的学习方式是先“粗刷”,通过记笔记的方式加深印象。刷完后,再周期性地复习,配合一些面经实用更佳。我并不觉得自己有多聪明,所以只能靠量变来积累(回忆起来,以前搞化学竞赛的时候,也是有过把厦大的无机化学狂刷20+遍后做到几乎把自己变成“哈希容器”的地步,任何一个概念都能自然地映射出其内涵🤣)。或许“刷”书不是最优解,就个人经历而言,却算得上一种“通用阶”🤣。天才有天才的学习方式,而吾等凡人只能靠“愚笨”一些的手段了。