面试复盘|字节跳动三轮面试总结
双非本科艰难求职,昨天终于面完了三面,晚上hr说我过了,写一篇总结一下三轮面试,摘要一些难点。
最近也会把我秋招的复习笔记整理出来,都是面试中遇到的问题。
因为项目每个人写的都不一样,所以我不描述自己的项目相关问题了。
一面20210722
- 分库分表?
这是今年比较常考的问题,他这个时候问我我还不会呢,不过每家都问,我也不能一直不会。
简单说一下:垂直拆分,按照列拆分。水平拆分,根据id取模,时间,地点分表。
xdm可以在评论区补充一下这个问题。 - time_wait过多怎么办,可不可以不要time_wait。
我觉得面试官想要的可能是这个答案:timewait快速回收和重用。快速回收:通过修改参数启用快速回收,此时timewait只有一个rto的时间。重用有两个条件,1.新连接的初始序列号比TW老连接的末序列号大。2.如果使用了时间戳,那么新到来的连接的时间戳比老连接的时间戳大。并且同一个ip和端口号的才能重用。 - redis的持久化策略。
这个很常考。我主要从这几个方面说,rdb和aof都是什么,都有哪些策略,是否阻塞主进程,aof的重写,实际使用时怎么用(aof和rdb混合使用)。 - 先递增再递减的数组,查出不重复数字的个数。
一面面经,https://www.nowcoder.com/discuss/689084。
二面20210806
- 你知道synchronized吗,介绍一下他的原理。
我就喜欢这样宽泛的问题,这样我就可以源源不断的扯了。首先说个锁升级,这中间就涉及到自旋锁,markword这些东西;然后带出来reentrantlock,说一下reentrantlock的构成和两者的对比,深入到aqs源码级别;然后时两者的wait和notify机制的不同和具体的实现,对于aqs就说一下condition的实现。整个一套组合拳打完,五分钟没问题。 - 线程池。
从线程池的调度入手,解释七个参数分别对应着什么。这个因为我的项目中用到了,所以几乎每一家都会问,背烂了。 - 进程和线程的区别,进程间通信方式。
常考问题。 - hashmap的原理,红黑树按照什么排序的?
主要说一下第二个问题,如果key实现了compareable接口,那可以利用compare排序;如果没有实现接口,根据类名字排序;类名字一样就按照hashcode排序。 - 算法:k个一组反转链表,但是要求从后向前k个一组的反转。
二面面经:https://www.nowcoder.com/discuss/699799。
三面20210824
- c和Java的区别?
我自己主动提出了内存泄漏,c语言很容易内存泄漏,Java并不会,因为垃圾收集了,但是也会存在这种情况,比如threadlocal。
但是我根本不理解c语言的内存泄漏是什么,我只好说一下threadlocal为什么内存泄漏。 - 归并排序的空间复杂度为什么On,为什么稳定?
对于空间复杂度,我说因为每次只开辟一个新的临时数组,用完就释放了,所以最后是On。
面试官:那你这么说,这个空间复杂度和你使用的语言有关,Java和c还不一样?
我:。。。。
对于稳定性,我觉得和写的归并算法有关,然后描述了一遍代码逻辑。 - 智力题,nim博弈。算法:90°旋转二维数组。
三面面经:https://www.nowcoder.com/discuss/718027
总结提问
归并排序的空间复杂度到底怎么说?
我上极客时间查了一下,原文是这样的:实际上,递归代码的空间复杂度并不能像时间复杂度那样累加。刚刚我们忘记了最重要的一点,那就是,尽管每次合并操作都需要申请额外的内存空间,但在合并完成之后,临时开辟的内存空间就被释放掉了。在任意时刻,CPU 只会有一个函数在执行,也就只会有一个临时的内存空间在使用。临时内存空间最大也不会超过 n 个数据的大小,所以空间复杂度是 O(n)。
确实是释放了,我知道Java自动收集了,但是c语言难道需要主动释放?应该也不是吧?
分库分表怎么答好一些,实际操作中需要注意哪些点?
这个我只能零散说几句,这套组合拳怎么打
全部评论
(34) 回帖