1、项目介绍

2、bean声明周期(自己从bean注册、注入和bean范围三方面进行了介绍,创建过程自己不是特别熟悉,也没有硬背诵)

3、mysql中常用数据存储引擎中索引差异

4、多线程实现方式(创建单个线程和使用线程池创建线程)

5、如可控制mq消费速度和mq如何保证可靠性消费(自己理解消费速度根据自己预估峰值消息量,消息太多,为了防止单个队列消息溢出,使用针对一个topic设置多个队列,针对消息可靠性或者至少被消费一次,分别从消息失败重试、手动Ack和死信队列进行回答)

6、jvm 内存模式

算法题:

力扣原题:链接Offer 68 - II. 二叉树的最近公共祖先

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉树:  root = [3,5,1,6,2,0,8,null,null,7,4] alt

示例 1:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。

示例 2:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。

相比于力扣解法,考虑在面试过程中可能需要自己创建二叉树,下面给出了自己的创建二叉树和求两个节点的公共祖先解法,了解基于java完成的树的创建,方便灵活面试官的各种要求。

注意点1:为了方便使用数组创建非完全二叉树,使用null表示节点为空,二叉树中节点值使用Integer类型,而不是使用int类型。

注意点2:由于java中参数是指传递,所有在使用先序递归方式创建树时,采用创建函数带返回值的方式。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class Tree {
    private static TreeNode root;
    public Tree(TreeNode root){
        this.root = root;
    }
    public static void main(String[] args) {
        Integer[] data = {3,5,1,6,2,0,8, null,null,7,4};
        Tree tree = new Tree(new Tree.TreeNode());
        int index = 0;
        int len = data.length;
        tree.initTree(data,index);
       // tree.traverse();
        //计算树种两个节点的最小公共祖先
        int node1 = 7;
        int node2 = 4;
        int res = tree.lowestCommonAncestor(node1,node2);
        System.out.println(res);
    }

    public int lowestCommonAncestor(int  node1,int node2) {
        //求节点node1 和node2 的最近公共祖先
        List<List<Integer>> pathes = new ArrayList<>();
        findPath(root,node1,node2,new ArrayList(),pathes);
        List<Integer> path1 = pathes.get(0);
        List<Integer> path2 = pathes.get(1);
        int i = 0;
        for(;i < path1.size()&& i < path2.size();i++){
            if(!path1.get(i).equals(path2.get(i))){
                break;
            }
        }
        return path1.get(i-1);
    }
    private void findPath(TreeNode node,int node1,int node2,List curr,List<List<Integer>> pathes){
        if(node!=null){
            if(node.val == node1 || node.val == node2){
                curr.add(node.val);
                List temp = new ArrayList(curr);
                pathes.add(temp);
            }
            curr.add(node.val);
            findPath(node.left,node1,node2,curr,pathes);
            curr.remove(curr.size()-1);
            findPath(node.right,node1,node2,curr,pathes);
        }
    }

    /**
     * the definition of Tree Node
     */
    static class TreeNode{

        private Integer val;
        private TreeNode left;
        private TreeNode right;
        public TreeNode(){
        }
        public TreeNode(int val){
            this.val = val;
        }
        public TreeNode(int val,TreeNode left,TreeNode right){
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }
    public void initTree(Integer[] data, int index){
        root = createTree(data,0, data.length);

    }
    private TreeNode createTree(Integer[] data,int index,int len){
        //先序遍历创建树
        if(index < len && data[index]!=null){
            TreeNode node = new TreeNode(data[index]);
            node.left = createTree(data,index*2+1,len);
            node.right = createTree(data,index*2+2,len);
            return node;
        }else{
            return null;
        }
    }
    public void traverse(){
        preOrder(root);
        System.out.println();
    }
    private  void preOrder(TreeNode root){
        //先序遍历
        if(root!=null){
            System.out.print(root.val+"\t");
            preOrder(root.left);
            preOrder(root.right);
        }
    }
}

运行结果:

alt