提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
在这篇文章中,我将分享和整理我在面试美团一面过程中遇到的一些问题和思路。希望通过我的经验分享,能够帮助到正在准备面试的你们。无论你是应届生还是有经验的开发者,这些问题和解析都将为你提供一些有价值的参考。让我们一起加油,共同进步!
一、二叉树的层序遍历
给定一个二叉树的根节点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优化
总结
本文主要是对美团一面面试题的总结和思路整理,希望对大家有所帮助!
其中拓展了解也是常被面试官问到的知识点,希望浏览者做相关的浏览和学习。