前言
这篇博客是自己在2019年12月29日去上海字节跳动总部面试抖音后台开发的经历,是从下午3点开始面试的,一共面了差不多快4个小时,然而结局defeat。。。在面完之后的几天之内心情极度低落,今天在寒风中绕着世纪公园跑了6公里,心情稍微好受一点,于是在2020年新年的第一天写下这篇面经。
一面(基础+算法)
第一面的面试官看起来很年轻,而且通过问题表达与追问的过程感觉是一个很聪明的人。刚开始就让我简单介绍一下自己的项目。然后就开始了测试技术的过程。
1.一个只有2G内存,但是100G的数据,如何找出这100G数据的中位数。
这个之前在学校找工作的时候看过,但是当时面试的时候忘记了,然后就现场想了一个方法,虽然能够解决问题,但是复杂度有点高,面试官问我有没有更优的。然后我就想到把100G的数据分成50份,每一份在内存中排一下序,然后剔除每一份的最大值,也就是50个数据排除最大值,然后再从被排除的那一份数据当中加进来第二大的,然后50个数再剔除最大的,也就是不断找到50份数据最大的,然后慢慢排除,直到找到中间的数字。
2.如何维护一个Topk热度的抖音视频排行榜。
这个问题我之前在别的地方看过,首先想到了用小顶堆进行实现。面试官又对这个问题拓展了一下,如果k不确定该怎么做。当时想到了用快排的思想,快排每次排序的时候都能把数据分成大于以及小于某个值的两部分,如果其中一部分正好是k个,那么只需要对这k个进行排序就可以了。
3.算法题目,对一个链表进行每隔k个反转。
当时自己写了一个反转链表的方法,但是没有对每隔k个这个问题写出完整的代码,只是说了自己的思想。
4.关于redis
问到自己看过redis,然后问redis的zset怎么实现的。以及redis如何做一个分布式锁,如何保证事务。有没有用过redis脚本。
二面(项目+算法)
项目
面试官一上来就让我介绍一下自己的项目,画一下结构,并且对于细节很感兴趣,项目的难点是什么。
1.概率题目。
三个人斗地主,问同时摸到大小王的概率,考虑最后底牌留3张,一个人是地主,另外两个是农民这种真实情况。当时自己考虑了一会,表达式稍微写的有点复杂。然后面试官把题目又简化了一下,一副扑克牌,抽两张,抽到一红一黑的概率。这个比较简单,然后很快就写了出来。
2.算法题目。
求几个数字的全排列(LeetCode原题),对于这个题目真的是很熟悉,然而自己当时想到的只是自己第一次做这道题目的时候暴力破解的方法,面试官有点不太满意,直接说这不就是暴力破解吗。然后提示我用递归来做。
3.算法题目2。
一个链表,比如1-》2-》3-》。。。。。-》n-1-》n,变成1-》n-》2-》n-1-》3-》。。。这样的形式。我很快说出了我的思路。首先用快慢指针找到链表的中部,然后反转后半段,然后把两段链表进行merge。然后分别写了找到中间节点,反转后半段,merge三个方法。merge方法写的时间比较久,这个方法没有写完整,只是说出了自己的思路。
4.架构设计题目。
微博当中一个用户关注了很多明星。如何设计一个关注系统。
5.基础
- 数据库的索引有哪些类型。都是怎么实现的。
- RocketMQ相比于其他消息队列有什么优势。
三面(项目+算法)
三面的面试官是一个leader。刚开始就问项目,对于项目的细节非常感兴趣,深挖项目当中的难点以及实现。
1.逻辑题。
一个岛上只有戴红白两种颜色帽子的岛民,大家不知道自己戴了什么颜色的帽子,彼此也不能沟通。如果确信自己戴了什么颜色的帽子,可以离开岛屿。一直没有人离岛,因为大家不知道自己戴了什么颜色的帽子。直到有一天,一个外来人对全部岛民说,你们当中至少有一人戴了红颜色的帽子,问接下来发生了什么。这道题目记得和之前看过的一个狗叫的题目如出一辙,只不过情景不一样。这道题并没有标准答案,只是考察一下自己的思路。
2.算法题。
一个矩阵里面都是数字,找出最长的递增路径,只用输出路径长度就可以,这个是LeetCode的原题。应该说我遇到的所有算法题目都是LeetCode的原题。
后语
面完之后觉得自己表现得还可以,至少比上次要强一点,然而通过Hr得到的反馈信息是希望自己在技术深度以及架构设计方面能有更多的思考。现在想想,自己的项目准备地真是太简单了,没有埋下几个面试官可以问的点,这让面试官看不到有哪些难点,就会让对方觉得自己的技术深度不够。另外觉得题目一定要刷,不过一定要有自己的思考,不然刷完题一点用都没有。
如果对你有帮助,请作者喝一杯牛奶吧