字节跳动一、二面面经(后台开发)
面的是一个做推荐相关的部门,具体名字忘了;
一二面连一块面完的,每面都在50分钟左右。一面呢,主要围绕我的简历上的项目展开,一个是我的课余实践项目-简易的高性能网络通信引擎,另一个是我的实习项目-一个高并发环境下的本地cache。面试官提的问题很细,挖的比较深,感觉真的听的很认真!另外还做了两个代码题,基础知识基本没问。两道代码题如下:
第一题要求完成两个需求:
1.可以在外部控制run的运行和终止;
2.每次执行stop函数可以立即将程序终止,无需休眠,实现完美退出;
第一个比较简单,第二个呢,我说可以用信号的方式来通知,但我没用过,不知道咋写。面试说可以修改休眠等待的方式,于是我就提了下用条件变量的cv.wait_for()函数,每次stop的时候直接cv.notify_one()打断休眠。
第二题我以为是一个高深的算法题,我说我只会暴力的方法。他提示可以通过预处理的减小复杂度,于是就加了些排序和减枝的操作在里头;
本以为一面挂了,但很快约二面,大概率是因为项目答的不错吧;
二面面试官很严肃但是更认真了,开始围绕我的本地cache深挖细节,问到了以下这些问题:
1.hashmap的查询时间复杂度是多少?一定是O(1)吗?
2.hashmap的负载因子一般是多少?为什么要设置成这个值?
3.hashmap的哈希桶数为什么要设置为2的n次方-1?
4.你使用的hashmap是怎么保障线程安全的?怎么做到线程安全的同时保障高效的?它的加锁范围你知道吗?
5.如果QPS过高,多个query同时对一个桶操作,排队加锁等待比较耗时,会严重影响性能,请问怎么解决(我提了三四种奇奇怪怪的解决办法,面试官都不满意。最后提了下那就同时开多个hashmap,再通过对query哈希到对应的hashmap上去操作,没想到终于说到面试官期待答案上去了)?
6.那请你将这个解决思路是实现下?(于是剩下的一半时间在写这个)
在他边提意见我边写的情况下,这个代码写完之后面试官就表示面试结束了;
一点感想:感觉字节的面试真的很nice,面试官循循善诱,很注重启发面试者思考和解决问题,而且认真程度很不一般,不像大多数厂家更多的是在考察背书背题能力。面试体验一流,感觉一次面试能学到很多东西。二面完后没消息了,感觉大概率挂了,不过有机会我还是会再面的!