美团 java一面试程序设计题 面试题笔记

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在这篇文章中,我将分享和整理我在面试美团一面过程中遇到的一些问题和思路。希望通过我的经验分享,能够帮助到正在准备面试的你们。无论你是应届生还是有经验的开发者,这些问题和解析都将为你提供一些有价值的参考。让我们一起加油,共同进步!


一、二叉树的层序遍历

给定一个二叉树的根节点root ,返回按层次的顺序遍历时所有节点的值(即从上到下,从左到右逐层遍历所有节点)

备注:

  • 树中节点数目在范围[0,2000]内
  • 1000<=Node.val<=1000
    示例:
    图例

输入:
root = [1,2,3,4,5]
输出:
[[1],[2,3],[4,5]]

解题思路
初看题时的想法是借助队列存储二叉树节点的值,然后再输出队列的值。
但是该题要求输出将每层的值放入到List里面,再放入外层List,再输出。
我的想法是借助额外的辅助数组,一般来说利用队列可以正常遍历所有值,但是输出的结果是放在一个List里面;比如[1,2,3,4,5]。并没有分层的List ,所以我们需要知道每一层的节点的个数。
创建一个数组,下标对应层数,数组下标的值对应节点数。
有了 List 和 每层数组的个数 我们就可以将每层值按照List输出了。

代码实现

//节点类
public class BiTreeNode {
    public int val;
    public BiTreeNode left;
    public BiTreeNode right;

    public BiTreeNode(int val, BiTreeNode left, BiTreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }

    public BiTreeNode(int val, BiTreeNode left) {
        this.val = val;
        this.left = left;
    }

    public BiTreeNode(BiTreeNode right, int val) {
        this.right = right;
        this.val = val;
    }

    public BiTreeNode(int val) {
        this.val = val;
    }

    public BiTreeNode() {
    }
}

//测试方法类
public class Main {
	//记录层数
    static int w = 0;
    //记录每层节点个数 
    //这里也可以使用List去记录每层节点
    //如果题上说层数大于2000就是用List
    static int[] width = new int[2000];

    public static void main(String[] args) {
        BiTreeNode biTreeNode = new BiTreeNode(1, new BiTreeNode(2, new BiTreeNode(4, new BiTreeNode(new BiTreeNode(6), 5))), new BiTreeNode(3));
        List<List<Integer>> list = getLayerList(biTreeNode);
        System.out.println(list);
    }

    private static List<List<Integer>> getLayerList(BiTreeNode biTreeNode) {
        if (biTreeNode == null) {
            return null;
        }
        List<List<Integer>> result = new ArrayList<>();
        LinkedBlockingQueue<BiTreeNode> objects = new LinkedBlockingQueue<>();
        objects.offer(biTreeNode);
        List<Integer> list1 = new ArrayList<>();
        while (true) {
            BiTreeNode poll1 = objects.poll();
            if (poll1 == null) {
                break;
            }
			//将一层节点出队放入list
            list1.add(poll1.val);

			//将一层节点存储到队列
            if (poll1.left != null) {
                objects.offer(poll1.left);
            }
            if (poll1.right != null) {
                objects.offer(poll1.right);
            }
        }
        getWidth(biTreeNode, 0);
        //循环width数组把每一层的数添加到List里面最终添加到外层List里面
        int num = 0;
        for (int i1 = 1; width[i1] != 0; i1++) {
            List<Integer> listPerLayer = new ArrayList<>();
            for (int i = 0; i < width[i1]; i++) {
                listPerLayer.add(list1.get(num));
                num++;
            }
            result.add(listPerLayer);
        }
        return result;
    }
	//获取每层节点的个数
    private static void getWidth(BiTreeNode biTreeNode, int w) {
        if (biTreeNode != null) {
            w++;
            width[w]++;
            if (biTreeNode.left != null) {
                getWidth(biTreeNode.left, w);
            }
            if (biTreeNode.right != null) {
                getWidth(biTreeNode.right, w);
            }
        }
    }
}

二、索引是否有效

table (a, b, c, d)
index(a, b, c)
where a=1
where b=1
where a=1 and b=1
where a=1 and c=1

这道题主要是有一个表table 表中有个联合索引 a,b,c 下面有四个判断条件;
说一下下面的四个判断条件哪个会失效,哪个会使用索引?

这个主要问的是最左索引原则的知识
这里主要知道两点:
1,在创建abc索引的时候 也会创建a 、ab 索引
2,失效场景

三、线程池

coreSize:3,maxSize:5,队列大小:10,从第1个线程到第11个线程加入,什么时候创建核心线程,什么时候创建最大线程,什么时候加入队列说下过程

线程池流程图如下:
在这里插入图片描述
拓展了解:
饱和策略的类型(拒绝策略)
在这里插入图片描述
知识链接: 拒绝策略
创建线程的方式
知识链接: 创建线程的方式
线程池的参数

 public ThreadPoolExecutor(int corePoolSize, //核心线程
                              int maximumPoolSize,//最大线程
                              long keepAliveTime,//闲置线程存活时间
                              TimeUnit unit,//时间单元
                              BlockingQueue<Runnable> workQueue,//工作队列
                              ThreadFactory threadFactory,//线程工厂  
                              RejectedExecutionHandler handler// 拒绝策略) 

四、列出所有用户下单数量大于100的用户

user表(user id, user name)
order表(order id, user id)
求:列出所有用户下单数量大于100的用户名

考察的是sql基本语法知识

select user.name
from user,order
where user.id = order.id
group by user.id
having count(order.id) >100

拓展了解
sql的执行顺序:
知识链接: sql的执行顺序
sql的执行计划及其作用和使用:
知识链接: sql的执行计划及其作用和使用
sql优化:
知识链接: sql优化


总结

本文主要是对美团一面面试题的总结和思路整理,希望对大家有所帮助!
其中拓展了解也是常被面试官问到的知识点,希望浏览者做相关的浏览和学习。

  • 25
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值