第一家撑到三面的公司,还是很开心的
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文件,对其进行快照,获得该时刻文件的快照。 要求在快照过程中,还可以将数据写入该文件中,或者修改该文件中的值。
答:建立一个缓冲区,把那些要改的数据和要更新的之前数据发到缓冲区里面(估计不对)