6号投简历,10号约面试,17面试,18给offer
头条一面
- Spring bean的生命周期
- Spring 循环依赖说一下?spring允许循环依赖吗 beanfactory和factorybean啥区别
- JVM 垃圾回收算法(我就把几个垃圾回收算法全讲了,每个垃圾回收器应用 场景,什么算法全说一下) oom的场景?(我从metaspace、stack、堆三个⻆度说,然后怎么排查 mat 工具啊等等)
- 因为我上面每个点都说的很⻓(显得我理解还ok的样子,导致时间不够了,他 就直接算法了
算法
- 第一题:一个数组,找三个数字,问能组成三⻆形的个数–双指针
- 第二题:lc 221 正方形那玩意,我推了很久,害 妈的都是做过的题
头条二面
ps:面试官都是知道一面面的啥的
- 数据库索引底层说一下 数据库的事物隔离级别是什么?(我这边还说了事物隔离级别分别用到了什 么锁算法)扯了很久
- 聊下mvcc redis线程模型,这边我扯了很久,反正很熟 如何设计一个像redis一样的缓存?这个简单,各种扯 redis的跳表知道吗。。。这个很简单,concurrentskiplistmap也给他扯了下
- https的过程
- tcp和udp的一些基础问题
- 如何设计一个处于tcp和udp之间的协议,可以自定义应用场景,我说了个游戏的
- 操作系统的分⻚和分段的区别是什么,随便扯
算法
- 给定一棵完全二叉树,返回最后一层的最右边的节点,要求最优解,我憋了很久。
代码如下
/**
* 求完全二叉树最后一个节点的值,要最优解
*
* 思路
* 方法一:层次遍历,输出最后一个节点,时间复杂度:O(N),BFS不给用的
* 由于是完全二叉树,求高度时只需一直往左遍历即可。每次递归都下降一层
* 先走当前节点的右边,如果发现一样,继续走右边,如果发现高度不一样了,那就选择走左边
* 每次都求树的高度,时间复杂度为O(lgN * lgN)。
*/
//测试代码
public static void main(String[] args) {
TreeNode node1 = new TreeNode(1);
TreeNode node2 = new TreeNode(2);
TreeNode node3 = new TreeNode(3);
TreeNode node4 = new TreeNode(4);
TreeNode node5 = new TreeNode(5);
TreeNode node6 = new TreeNode(6);
TreeNode node7 = new TreeNode(7);
node1.left = node2;
node1.right = node3;
node2.left = node4;
node2.right = node5;
node3.left = node6;
node3.right = node7;
TreeNode lastNode = getLastNode(node1);
System.out.println(lastNode.val);
}
static class TreeNode{
int val;
TreeNode left, right;
public TreeNode(int val) {
this.val = val;
left = right = null;
}
}
public static TreeNode getLastNode(TreeNode root) {
//到达底层,如果这个节点的left为null,就说明是最后一个了,这是我们走一遍走过来的,每次只选一边
if (root.left == null) { //其实这里还要加个root == null
return root;
}
int left = dfs(root.left);
int right = dfs(root.right);
if (left > right) {
return getLastNode(root.left);
} else { //只要小于等于就继续走右边
return getLastNode(root.right);
}
}
//计算高度
private static int dfs(TreeNode root) {
if (root == null) return 0;
return 1 + dfs(root.left);
}