⾯试复盘|一二面+抖音后端邀约交叉面面经,已OC
本人近期面完了字节,岗位是抖音的后端开发,已经拿到了意向书,前前后后加在一起大概十多天的时间,下面是一个简单的记录,希望能够帮助到大家~
岗位投递
首先是岗位投递。其实之前三月份的时候有投递字节的暑期实习,不过三面挂了,但也因为这个原因进了人才库哈哈,所以提前批的时候就有HR联系面试,沟通了一下岗位内容,觉得比较合适,然后就进 入到面试流程了。
一面+二面
字节的面试风格非常鲜明,就是快快快,效率非常高!(但是也很累哈哈),经常是一二面甚至一二三面全部合并在一起,一下午走完。所以,不出意料的,直接就是一二面合在一起面了。
一面的面试官比较注重基础,得知我平时C++用的比较多,就问了许多关于C++的基础知识,当然也是一些常考的考点,包括:
- 程序的内存布局
- 内存申请方式,比如malloc与new的区别?
- 重载与重写,以及虚函数的原理
- C++标准库中涉及到了很多的多态设计,能否据一些例子?
- ...
基础问罢,就要开始做题了,一面一共了做了2道:
- 寻找无序数组的中位数。
- 两个线程交替输出奇数和偶数
第一题我是用partion分治去写的,时间复杂度会低一些。第二题是用std::condition_variable
去做的,不过很尴尬,API记得不是很清楚,所以和面试官沟通了一下,查阅了一下文档。但是很坑的是,牛客后端在编译代码的时候没有链接pthread库,所以不能运行...总的来说一面发挥的一般
二面的面试官上来也是先让做两道题:
- 桌子上有一堆石头,两个人进行比赛,每个人交替从桌子上拿石头,可以拿1或2或3个石头,谁拿到最后的一个石头,谁就输了。问,桌子上有n个石头的话,哪一个人会赢
- 一个二维数组,其中的元素为1代表陆地,0代表大海,相邻的陆地连接在一起成为岛屿。找出岛屿的个数
第一道题我下意识的觉得是有规律的,但是一下子想不出来,就用dp去写。写出来之后确实有规律,然后面试官让我解释一下为什么是这个规律,我思考了一下,给出了答案。(其实该题更像是一个脑筋 急转弯...)第二题就用dfs去写就好了。
题目做完之后,面试官想问一个设计题,大概就是设计一个秒杀系统需要考虑哪些因素。说实话,我很少接触分布式这些东西,所以也就没说个啥出来。二面也就到这里了。
交叉面(或者三面+四面+五面...)
一二面面完之后,过了一两天,HR联系,说之前面试官觉得不是特别匹配,所以请了另外的组再搞个交叉面。其实我知道自己之前发挥的不是很好,所以觉得就是重新开始面了哈哈。果然,这一次是连着 面了三轮,一下午的时间。
一面面试官也是上来就让做题,大概如下:
- 给一个用数组表示的数字(比如说
[1,4,3,5]
表示1435
),请交换元素的顺序,使其输出比这个数字更大的最小的那个数字。(比如刚刚的例子,就应该是1453
)
说实话,这道题应该是lc的经典题目了,但是涉及到了好几个步骤,不过最后还是做出来了。做完之后问了一些简单的基础(忘了问了啥了。。。),然后一面结束。
二面面试官上来也不废话,也是直接做题:
- 给定两个字符串
S
和T
,在S中找出包含T的所有字符的最短的子序列。
这道题也是经典题目,滑动窗口,所以我也就不废话,直接开写,后面写完之后发现有个小问题,是++
写了两次。更正之后就没问题了。
做完算法题之后,开始问一些基础,各种基础都有,当然都是浅尝辄止,没有过于深入,比如: - MySQL的索引原理,为什么有的时候没办法走索引?
- C/C++中的
\n
和std::endl
有什么区别? - 虚函数的实现原理以及优缺点?
虚函数的优缺点那里我答的比较多,因为之前有看过陈硕老师的书,里面重点讲了虚函数机制的ABI脆弱性,所以答得比较深入。(感谢陈硕老师...)
最后就是三面了。三面是组内的leader来面的,先问了一些redis等开源工具的小问题,这些都很简单,直接略过。然后也是让做一道题,题目很简单,就是将两个有序数组合并为一个有序数组。但是面试官想考察的重点不是这个问题,而是后面的引申,也就是现在有K个有序数组,也要进行合并,问我用什么方法。我直接回答用堆,然后面试官没有让我写代码,而是让我分析一下时间复杂度是多少。这里我开始答错了,说Nlog(K)
。面试官就开始引导我,说再仔细考虑一下,然后我就说了一下堆的原理,以及堆排序的流程,后面面试官就指出问题了,初始的时候构建一个堆的复杂度是是多少?这里我栽了跟头,因为确实没怎么记过,所以又是一番深入的探讨,包括写出对应的大O表达式推到之类的。最后面试官告诉了答案,max(Nlog(K), K)
,我才终于恍然大悟。
问完专业问题之后,面试官最后也问了一些其他的问题,比如之前在其他公司的实习的体验,对于字节的产品的看法之类的。面完之后等待了几天约了一下HR面,聊了一下学习经历,实习经历等等,体验 很不错哈哈。最后经过一周左右的审批之后,发了意向书。
思考与总结
字节对于算法的考核占了很大的比重,所以平时多多练习算法是很有好处的。其他方面,也是一点个人的思考:网络上其实有很多技术博客,但大多都写的很杂很乱,可以说80%的博客都是写给作者自己看的,所以说,期望用这些短篇幅的博客去延展自己的技术深度的话,我个人是不建议的。学弟学妹们可以花更多的时间去读一读经典的技术书籍,虽然很多都是大部头,但大部头都是作者呕心沥血编著而 成,已经尽可能地省去不重要的东西了,那么,肯定是能从这些书籍中萃取中精华的。如果需要书籍推荐的话,C/C++语言本身的书籍我就不推荐了,有很多。但对于系统类的知识(就是俗称的八股文... ),我觉得能把《UNIX环境高级编程》(APUE)通读一下,应该能有很多的收获,这本书里面讲到了很多东西,包括I/O,系统调用,内存布局,IPC, RPC之类的,都很有帮助。
希望能够给大家带来一些帮助,谢谢!
#面试复盘##字节跳动##校招##后端开发##面经#