20210312~java面试记录
算法笔试40mins+基础面试20mins
算法题:
------【1】判断两棵二叉树的同构,
同构:一棵树的任意节点的左右子树任意次交换后,能和另外一棵树相同,那么这两棵树是同构的;
judge(root1, root2): 1、都为空树,则同构 2、一空一非空,则非同构 3、根值不同,则非同构 4、两棵树的左子树都为空,则judge(root1.right, root2.right) 5、两棵树的左子树都不为空,且值相同: judge(root1.left, root2.left) and judge(root1.right, root2.right) else 5: judge(root1.left, root2.right) and judge(root1.right, root2.left)
-----【2.1】使用数组,实现一个循环队列(先进先出);不要额外增加全局变量
循环队列:求余实现弯曲效果,循环队列必须给定最大值MAX_Q_SIZE;—利用循环解决空间浪费问题;
front、rear:rear追到head说明对队列满了,front追上rear说明队列为空;
当rear=front时,队列可能为空,也可能为满;
满: 队列添加元素到rear的下一个元素是head时,(Q.rear+1)%MAX_Q_SIZE== Q.front;
空: 队列删除元素到head = rear时, Q.rear = Q.front;
添加和删除元素都要求余;
添加: (rear+1)%MAX_Q_SIZE
删除:(front+1)%MAX_Q_SIZE
-----【2.2】无锁支持并发(一个push线程、多个pop线程;单个生产者多个消费者,提示:可使用cas原子操作)???
-----【3】在二叉排列树上面找出第N大的节点。 注意:不能把二叉树全量存储到另外的存储空间:比如存储到数组后再取出;
中序递归遍历,每访问完一个节点,count++直到第N个;
基础题:
-----【1】OS内存为什么要分为逻辑地址和物理地址?
逻辑地址:CPU所生成的地址,该地址是内部和编程使用的、并不唯一;
物理地址:内存中的内存单元实际地址,就是内存中每个内存单元的编号,这个编号是顺序拍好的,物理地址的大小决定了内存中有多少个内存单元;
-----【2】TCP四次挥手中time_wait字段的作用?
TCP的四次挥手:因为每个方向都需要一个FIN和一个ACK
1、主动关闭
连接的才有TIME_WAIT状态;
2、TIME_WAIT== 2 MSL因为1)防止旧连接的数据包,2)确保最后的ACK能被服务器接收到;
MSL: 报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间,报文将被丢弃;
TTL:是ip数据报可以经过的最大路由数,没经过一个处理它的路由器,此值就减1,当此值为0时,数据包将被丢弃;
MSL >= TTL消耗为0的时间,以确保报文被自然消亡;
TIME_WAIT== 2 MSL:网络中可能存在来自客户端的数据包,这些数据包被服务器处理后,需要给客户端反馈,一来一回需要2倍时间;
3、三次握手:第三次握手是可以携带数据的,前两次不可以;
三次握手原因:1)阻止重复历史连接的初始化 、2)同步双方的初始序列号、3)避免资源浪费