字节跳动和腾讯后台开发实习生面经
本人广州985渣硕软件工程,春招找实习投了阿里、字节和腾讯,字节给了口头offer,腾讯状态已完成,阿里三面应该挂了就不说了。
大概总结一下:
字节面试的效率很快,都是面试完当天电话给回复并确定下一次面试时间,还有短信和邮件通知,面试体验也很好,面试过程基本都是先手撕两道算法题再问问题,问题难度都还好,没问C++应该是部门用的Go/Python,而我简历写的是C++。面试时使用的是牛客的网页,可以直接打代码,都有开视频。
腾讯面试的效率也不错,基本相隔一两天,面试体验也不错,面试官最后都给了一些建议,面试竟然没手撕算法题是没想到的,关于数据库的问题感觉比较深入。面试时使用的是腾讯会议,一些代码和命令共享屏幕展示,是否开视频看面试官要求。
等腾讯最终结果,顺利的话在腾讯字节做一个选择,春招就结束了~感谢牛客,在这里看了很多面经和一些资料整理,都提供了很大的帮助!
大家加油,相信自己,充分做好准备,祝大家都能拿到心仪的offer~
字节(广州效率工程)
- 一面
· 算法:二叉树任意两个节点之间最长路径的长度
· 算法:买卖股票(1次和多次)
· 进程线程协程的区别
· 隔离级别
· 索引,为什么用B+树
· 三次握手、四次挥手 - 二面
· 算法:URL反转: 给定形如www.toutiao.com
的 URL,将其转换成com.toutiao.www
的形式,要求必须原地操作(剑指offer的题)
· 算法:合并n个有序数组,并进行时间复杂度分析
· mysql索引、B+树、事务ACID、原子性的实现(undo log)
· TCP流量控制、拥塞控制、TCP/UDP
· select/poll/epoll区别、底层源码实现、epoll优势
· Redis常用类型、数据结构、有序集合(哈希表和跳表)、单线程的优势
· HTTP1.0/1.1/2.0/3.0区别(connection:keepalive, cache-control, pipeline多条TCP连接, HOLB, 头部压缩, 二进制流, QUIC/UDP)
· HTTP2.0(单个TCP复用,二进制流帧、header帧和data帧,头部压缩,同时多个HTTP请求和响应)
· Redis 键值对过期(惰性删除、定期删除) - 三面
· 项目细问(简历提到的全部问了,问得比较细,简历项目和后台开发关系不大,基本都是实验室的项目,关于CV的一些项目,介绍了使用的模型和机器学习的一些问题)
· 主要喜欢什么技术?怎么学习新技术?
· 看什么书,看什么源码?(Redis源码印象最深的地方?讲了Redis的一些源码和理解)
· 乐观锁和悲观锁(讲了MySQL对应的)
· 开放题:电梯的调度策略
· 为什么用Docker?其他容器技术?K8S听说过吗?
· 职业规划 - HR
· 聊了30分钟,主要问大学生活和项目
· 当天打电话给了口头offer
腾讯(深圳CDG财付通)
- 一面(初试)
· static、const(各种场景的用法)
· new、malloc区别、使用
· STL vector/list的实现、数组链表区别、map/unordered_map的实现、哈希表的相关问题(哈希冲突)
· 红黑树、AVL,主要问了特性和区别
· 纯虚函数、虚函数、多态(虚指针、虚函数表)、this 指针
· 构造函数(为什么不能是虚函数)、析构函数(可以是虚函数吗?什么时候必须是虚函数?)、类默认成员函数
· 堆和栈(内存布局,内核空间、用户空间)
· select/epoll
· IPC(方式,共享内存实现)
· 三次握手、socket函数
· mysql存储引擎、索引(B+树)、事务(ACID)、隔离级别(各个场景)、主仆复制
· Redis、与MySQL数据一致性问题
· Linux 常用命令:free/top
· GDB(x/p/bt/info)
· 18亿用户数据,设计一个系统根据唯一ID查找用户数据 - 二面(复试)
· map<int,string> 删除key能被2整除的元素(代码,其实主要是erase导致迭代器失效的问题),map/vector的底层实现
· 一个C++空类编程默认提供的函数(6个,两个取址的操作符重载)
· 多线程/多进程的优势和劣势(n核CPU的线程数怎么选择)
· Linux 常用命令,find/awk/grep的使用,出了一个简单的awk使用的题目
· IPC、线程同步、进程同步(共享内存、信号量、记录锁)
· C++多态(函数重载、虚函数指针和虚函数表)
· B+树、聚簇索引、非聚簇索引,聚簇索引可以有多个吗?
· 事务ACID、隔离性、MySQL数据存储引擎
· select/poll/epoll, epoll的优势
· 浏览器输入URL的整个过程
· TCP四次挥手(为什么需要四次,状态,TIME_WAIT作用)
· 数据库一致性问题(Redis/MySQL,这里比较开放性)
· 文件系统(inode)、内存系统(虚拟内存) - 三面(复试)PS:这一面有点压力面的感觉
· map/vector的删除(不是二面问过了吗?惊了。再讲一遍,也讲了一下迭代器失效的原因,底层红黑树、动态数组实现)
· C++内存模型(主要也还是虚函数指针和虚函数表)
· IPC(不是一面二面问过了吗?惊了。)
· epoll(使用边缘触发的注意点,信号中断时怎么处理?errno = EINTR)
· 共享内存的同步问题(互斥锁、记录锁、信号量,介绍一下各个方式)
· TCP/UDP的区别,详细讲讲(把知道的都讲了)
· 事务的隔离级别、两个事务操作加钱问题(一个+50,一个+100,怎么保证最终结果+150。InnoDB RR级别下MVVC的一致性视图、修改时是当前读,update set k=k+50,这个当时好像没解释清楚,所以提了悲观锁,也就有了下面的问题)
· select for update锁的机制
· 索引(聚簇索引、非聚簇索引、覆盖索引,相关原理)
· Redis、MySQL一致性问题(太喜欢问这个问题了吧,面试官还讲了个场景:活动期间导致海量用户注册,怎么解决缓存穿透问题?讲了布隆过滤器过滤未注册的用户,也提了相关的误判率,还讲了Redis/MySQL一致性的一些操作,面试官好像不太满意,解释了好久好久。)
· 自己评价一下自己,有什么优缺点,有什么需要改进的地方 - 四面(GM)
· 虚函数、C++ 内存模型、深拷贝(拷贝构造函数、拷贝赋值函数)
· C++98/11/14/17相关的特性、智能指针
· 内存泄漏问题(new/delete, malloc/free, Valgrind)
· 平常怎么调试(strace/gdb/core dump)
· 怎么检查服务器网络问题(ping/netstat/tcpdump)
· 浏览器输入URL过程(DNS/HTTPS/TLS/HTTP/TCP/UDP/IP/ARP)
· Redis源码(事件循环ae,单线程IO多路复用,Redis数据结构实现)
· 数据库的索引(MySQL InnoDB索引、B+树)
· MySQL慢查询分析(慢查询日志、explain、索引优化)
· 设计模式(单例的懒汉/饿汉、线程安全问题,装饰器模式,观察者模式,适配器模式、策略模式、迭代器模式)
· Nginx网络模型(多进程、Linux epoll、freeBSD kqueue)、负载均衡原理和策略、静态文件服务器、OpenResty(这部分都没特别深入)
· 数据库一致性问题(cache/DB的读写一致性,2PC)、数据库容灾(redolog/binlog、业界的解决方案:这个不太清楚,面试官提到几个还没听清) - HR
· 3.30 感冒不舒服睡了一下午,醒来就接到hr电话,10分钟简单聊了一下,说这周给结果,然后查状态就变已完成了