字节跳动番茄小说团队,后台开发,楼主技术栈是CPP。三次面试问的基础很少,大部分问题都是围绕着项目提问,其次就是算法题。
题目没有记录完整,有些记不太清了,想起来再记。
没有HR面,已经收到了意向书
一面(7.26)
1.自我介绍
2.项目(问题3~7是项目相关的,可以忽略)
3.socket在内核有buffer,为什么还需要应用层buffer?
4.把本地数据发送到其他端,有什么优化方法?(零拷贝)
5.多reactor模式 ,主从模式有什么优势?
6.epoll原理,ET和LT分别适合哪些场景?
7.日志系统打印到本地文件时占用的磁盘IO有没有一个评估,对IO有没有优化
8.互斥锁和自旋锁
9.进程调度算法,详细说下时间片轮转,时间片轮转法有什么缺点?
10.死锁,死锁预防和死锁避免
11.算法题1: LeetCode20,有效的括号
12.算法题2:居然出了个hard,最长有效括号,类似于LeetCode32,但是括号类型有三种 () {} [] ,没做出来。。。
问题答的还行,算法题第二个是个hard,没撕出来,也给过了
二面(7.26)
1.项目相关
2.set 和 priority_queue底层实现
3.scatter/gather
4.timefd 如何统一事件源,超时事件什么时候处理
5.主reactor如何与子reactor通信,如何将线程从epoll_wait阻塞中唤醒
6.日志系统的性能瓶颈在哪
7.算法题1:实现单向链表里 bool remove(int val) 和 ListNode operator=(const ListNode l2)赋值运算符两个方法
8.算法题2:给定一个数组,数组前边部分是一堆负数,中间是一堆0,右边是一堆正数,找最后一个负数和第一个正数
三面(7.28)
1.上来就先来一道算法题:二叉树的最近公共父节点
我的第一反应是用递归来做,但是面试官说复杂度太高,让我用一次遍历解决。后来改为利用辅助栈,将问题转化为寻找链表的第一个公共节点问题。
2.我简历上有日志系统相关的,面试官让设计一个日志系统,说一下主要思路,满足如下要求:
- 针对每个trace id,可以得到对应的链式调用关系,例如对于请求1,A服务调用了B服务,B服务调用了C服务
- 日志器输出等级 DEBUG,INFO,WARN,ERROR......等,每当在一段固定的时间内WARN的数量超过一定的阈值时就报警,例如在8点和9点间WARN出现了100次,这个时候就应该报警
3.基础知识:
- 服务端socket有哪些api?
- listen的fd和accept得到的fd有什么不同,listen的参数和accept参数有什么不同?
- 异步非阻塞有什么好处?
- 三面忘记录音了,还有问了其他一些基础知识,忘记了。。。。。。
全部评论
(8) 回帖