【字节跳动】-Java岗-头条三面凉经

第一家撑到三面的公司,还是很开心的

1面:

1.算法题:求二叉树两节点的最长距离,搞了30分钟。。。

2.volatile修饰符的作用

答:volatile保证线程对该变量的可见性,根据JMM模型每个线程都有一块抽象私有的本地内存区域,该区域与主内存进行交互(当对volatile变量进行写的时候,会是其他线程的内存中存储该变量的值失效)

3.能不能写一个函数,由于指令重排序导致其输出的结果不是想要的

4.解释下 happen-before的规则

2面:

1.算法题:求前序遍历的递归,非递归算法

2.算法题:求一个数组中连续子数组的最大值, 如 【3,-4,1,2】,最大值为3,子数组为【1,2】

3.画出TCP的4次挥手过程,为什么需要四次,不能三次吗

答:当服务端接收到客户端的FIN数据报时,服务端可能还有需要发送的数据,因此FIN与ACK不能合并到一起发送。如果合并到一起发送,就不能确定服务器发送的数据,客户端是否接收到了。

4.解释下TIME_WAIT, 为什么取值为2MSL

答:2MSL刚好是数据报进行一个来回的时间,目的是为了确认服务端没有再次发送FIN;

5.如果服务端中存在大量的TIME_WAIT请分析下原因

答:发送在服务端主动断开连接,并发送ACK响应,进入TIME_WAIT状态,如果客户端一直在向客户端发送FIN包,服务器就会一直发送

6.说下操作系统中页面置换算法

答:先进先出,LRU,

7.说下LRU的实现思路

8.概率题:甲和乙投掷硬币,谁先投到正面谁就赢。先投的人赢的概率是多少 答案应该是2/3,通过一个等比数列可以算出

3面

1.进程与线程的区别(这个不太清楚)
答:一个进程可以有多个线程,一个线程只能属于一个进程。进程的上下文切换的代价比较大:因为进程切换时,会导致高速缓冲区失效;线程上下文切换时,只需要替换程序计数器,还有线程私有内存区就行了。

2.进程切换还需要改变什么

答:进程还需要保存打开文件的状态描述符

3.线程进行替换时,哪些东西会变

4.了解过一些中间件吗,例如负载均衡,数据库,分布式
答:不太清楚

5.了解过b树与b+树的区别吗(我需要好好梳理一下)

答:b树的非叶子节点存储索引和数据,而b+树只在叶子节点存储

6.为什么b+树需要这么做

答与磁盘的IO读取有关,balala,不需要说到了b+树类似平衡树(感觉面试官开始怼了)

7.那么二叉平衡树也可以在非叶子节点存储索引,叶子节点存储数据。两者有什么不同

答:b+树叶子节点用了链表

8.那么二叉平衡树在叶子节点加链表。两者有什么不同

答:b+树是多叉树,这样可以减少树的深度

9.了解隔离性

答只知道有四种隔离

10.算法题: 将一个字符串改变其字符(假设需要将字符x变成y,则y也需要变成x),使其与另一个字符串相等
例子 字符串1: aabba -> 字符串2: eeffe //这里 字符串1a变成e,然后该字符串中如果存在e,也要把它变成a,这个返回ture

字符串1: asdf -> 字符串2: asag 返回false

11.工程题:

给你一个大的Hash文件,对其进行快照,获得该时刻文件的快照。 要求在快照过程中,还可以将数据写入该文件中,或者修改该文件中的值。

答:建立一个缓冲区,把那些要改的数据和要更新的之前数据发到缓冲区里面(估计不对)

发表评论

后才能评论