字节跳动后端技术四面真题

面试前准备

1. 算法

头条每轮技术面试都有算法题:先是快速刷完了剑指offer,这个校招时已经刷过两边了,因此现在刷起来会相对快一些。然后就是啃LeetCode的题了,LeetCode的题比较多,想在短短几周内刷完基本是不可能的,因此我主要按照类型去刷,每个类型刷几道就会比较有感觉了。比如链表的题优先考虑递归和双指针来解决,栈和队列的题优先考虑用两个栈或队列来解决,树的题基本都是递归等。不过数组和字符串的题一般比较灵活,这种题只能尽量多刷了。

平时要上班刷题也不方便,我采用的方法就是看题,用手机打开LeetCode的网站,看完题目后直接想解决方案,脑子里大概捋一下代码怎么写,能想到的就过,想不出的就看看别人的解法,用这个方法刷起来就很快。用这种方法你可能会担心面试时题写不完整,其实不用太担心,因为面试的时候面试官看你写的核心思路是正确的,边界处理是对的基本就过了,面试时间比较有限。

2. 理论基础

基础这一块主要以快速复习为主,主要是语言(我主要用C++,所以复习C++)、操作系统和网络编程。

操作系统就看内存管理、进程管理和文件系统,一般虚拟内存问的多。网络编程这块就包括TCP/IP协议,HTTP协议,网络安全三个方面。

TCP/IP主要就是三次握手,四次挥手,TIME_WAIT的作用等这些常考的题了。

HTTP协议考察HTTP协议的返回码、HTTP的方法等。需要特别指出的是HTTPS加密的详细过程要非常透彻,不然容易产生一种感觉好像都清楚了,但是一问就有点说不清楚。最后就是网络安全,主要考察也是WEB安全,包括XSS,CSRF,SQL注入等。

3. 后端技术

这里的后端技术主要指工作中要用到的一些基础组件,一些常见的后端架构设计。主要准备了MySQL、Redis、消息队列、zookeeper、分布式系统架构设计和docker。

4. 深挖项目

没有参与开源项目的经验,工作中做的项目也很一般,项目这块我实在没什么太多拿的出手的,不过还是要挖掘一下,毕竟这一块是逃不掉。我说几个我思考的点吧:

  1. 找项目中相对而言具有亮点的地方。比如我用redis实现了一个延时队列,然后对这个延时队列我通过分片来解决瓶颈,通过分发来加快处理速度。

  2. 找项目中复杂的地方。如果你做的项目中有复杂的地方,即使不是你做的,也可以拿来说,前提是你要搞得非常清楚来。

  3. 量化指标。一个接口原来有性能问题,比如你做了一个小的优化,将其TP99的耗时从原来的500ms优化至多少200ms。

  4. 赋能整个团队。在开发业务的过程中肯定会遇到一些重复的工作,或者可以复用的服务。你可以开发了某个工具或者服务化了某个功能推广到了全组使用,给公司创造了价值。

面试真题

1. 一面

  1. 问项目

  2. 任务系统怎么保证任务完成后发奖一定成功

  3. zset延时队列怎么实现的

  4. redis数据结构有哪些?分别怎么实现的?

  5. redis的持久化

  6. mysql的索引

  7. 一个无序数组找其子序列构成的和最大,要求子序列中的元素在原数组中两两都不相邻

2. 二面

  1. Redis的ZSET怎么实现的?尽量介绍的全一点,跳跃表加哈希表以及压缩链表

  2. Redis的ZSET做排行榜时,如果要实现分数相同时按时间顺序排序怎么实现?说了一个将score拆成高32位和低32位,高32位存分数,低32位存时间的方法。问还有没有其他方法,想不出了

  3. MySQL事务的四个隔离级别?先说了四个级别的区别,然后说了每个级别可能产生的问题

  4. binlog日志和redolog日志清楚吗?说了两个日志的作用以及两阶段提交

  5. C++的动态多态怎么实现的?

  6. C++的构造函数可以是虚函数吗?

  7. 缺失的第一个正数(leetcode第41题)

  8. linux系统里,一个被打开的文件可以被另一个进程删除吗?

  9. 一个10M大小的buffer里存满了数据,现在要把这个buffer里的数据尽量发出去,可以允许部分丢包,问是用TCP好还是UDP好?为什么?

  10. 一个完整的HTTP请求会涉及到哪些协议?

3. 三面

  1. 问项目

  2. redis的ZSET是怎么实现的?

  3. 让你设计一个限流的系统怎么做?令牌桶

  4. 让你设计一个延时任务系统怎么做?说了两个方案,一个是使用redis的ZSET来实现,考虑分片来抗高并发,使用redis的持久化来实现落地,使用redis的哨兵实现故障转移。一个是使用时间轮的方法。

  5. 现有一个随机数生成器可以生成0到4的数,现在要让你用这个随机数生成器生成0 到6的随机数,要保证生成的数概率均匀。

  6. 有N枚棋子,每个人一次可以拿1到M个,谁拿完后棋子的数量为0谁就获胜。现在有1000颗棋子,每次最多拿8个,A先拿,那么A有必胜的拿法吗?第一个人拿完后剩余棋子的数量是8的倍数就必胜,否则就必输。

  7. 给出一棵二叉树的根节点,现在有这个二叉树的部分节点,要求这些节点最近的公共祖先

4. 四面

HR面

总结

4轮面试都是视频面的,体验其实还是挺好的,坐在家里面试我会更加放松一些,这样脑子也灵活一些。人一紧张脑子就转不动了。

头条的三轮面试都问了zset的实现,ZSET的实现可以好好看看源码怎么实现,这样说的时候有更多东西可以说,不是说一个跳跃表就完事了。还有一点就是遇到不会的逻辑题或者算法题不要放弃,问问面试官可不可以提示一下。如果能在面试官的慢慢提示下能完成这道题,也是会被认可的。



如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,

咱们下期见!答案获取方式:已赞 已评 已关~

学习更多知识与技巧,关注与私信博主(03)

你可能感兴趣的:(后端,java,面试,面试,java,职场和发展)