本文为拉勾网《32个Java面试必考点》学习笔记.只是对视频内容进行简单整理,详细内容还请自行观看视频《32个Java面试必考点》.若本文侵犯了相关所有者的权益,请联系:txzw@live.cn.将会删除相关内容
知识点汇总
知识点详解
数据结构
树
二叉搜索树
每个节点都包含一个值,每个节点至多有两棵子树,左孩子小于自己,右孩子大于自己,时间复杂度是O(log(n)),随着不断插入节点,二叉树树高变大,当只有左(右)孩子时,时间复杂度变为O(n).
平衡二叉树
保证每个节点左右子树高度差绝对值不超过1.
比如,AVL树在插入和删除数据是经常需要旋转以保持平衡.适合插入删除少场景.
红黑树
非严格平衡二叉树,更关注局部平衡,而非总体平衡,没有一条路径比其他路径长出两倍,接近平衡,减少了许多不必要的旋转操作,更加实用.
特点:
- 每个节点不是红就是黑
- 根节点是黑色
- 每个叶子都是黑色空节点
- 红色节点的子节点都是黑的
- 任意节点到其叶节点的每条路径上存在的黑色节点数量相同.
B树
适用于文件索引,优先减少磁盘IO次数,最大子节点称为B树的阶
m阶b树特点:
- 非叶子节点最多有m棵子树
- 根节点最少有两棵子树
- 非根非叶节点最少有m/2棵子树
- 非子叶节点保存的关键字个数,为该节点子树个数减一
- 非叶子节点的关键字大小有序
- 关键字的左孩子都小于该关键字,右孩子都大于关键字
- 所有叶节点都在同一层
- 采用二分查找法
B+树
定义与b树基本相同,
区别:
- 节点有多少关键字,有多少子树
- 关键字对应子树的节点都大于等于关键字,子树中包括关键字自身
- 所有关键字都出现在叶节点中
- 所有叶节点都有指向下一个叶节点的指针
- 搜索时只会命中叶节点,叶子节点相当于数据存储层,保存关键字对应的数据,非叶节点只保存关键字与指向叶节点的指针
B+树比B树更适合做索引:
- 叶节点之间有指针相连,B+树跟适合范围检索
- 由于非叶节点只保留关键字和指针,B+树可以容纳更多的关键字,降低树高,磁盘IO代价更低
- B+树查询过程稳定,必须由根节点到叶节点,所有关键字查询路径相同,效率相当.Mysql数据可得索引就提供了B+树的实现
B*树
在B+树的非叶节点上增加了指向同一层下一个非叶节点的指针
算法
字符串匹配问题
先于面试官交流,询问是否有其他要求
Example:判断给定字符串中的符号是否匹配
解题思路:
1. 使用栈
2. 遇到左括号入栈
3. 与右括号出栈,判断出栈括号是否成对
private static fianl Map<Character,Character> brackets = new HashMap<>();
static{
brackets.put(')','(');
brackets.put(']','[');
brackets.put('}','{');
}
public static boolean isMatch(String str){
if(str==null){
return false;
}
Stack<Character> stack = new stack<>();
for(char ch : str.toCharArray()){
if(barckets.containsValue(ch)){
stack.put(che);
} else if (brackets.contiansKey(ch)){
if(stack.empty() || stack.pop() != bracjets.get(ch)){
return false;
}
}
}
return stack.empty();
}
解题技巧
认真审题:
- 单模匹配还是多模匹配
- 时间复杂度空间复杂度是否有要求
- 明确期望的返回值,如,多匹配结果的处理
解题思路
- 单模匹配:BM,KMP算法
- 多模匹配:Tire树
- 前缀或后缀匹配
- 可以借助栈,树等数据结构
TopK问题
找出N个数中最小的k个数(N非常大)
解法:
- 用前K个数创建大小为K的大根堆
- 剩余的N-K个数与堆顶进行比较
时间复杂度:O(N*log(K))
优点:不用在内存中读入所有元素,适用于非常大的数据集
从N有序队列中找到最小的K个值
解法:
- 用N个队列的最小值组成大小为K的小根堆
- 取堆顶值
- 将堆顶值所在队列的下个值加入堆(与堆中最大值比较,若该值大于最大值则可停止循环)
- 重复步骤2,直到K次
时间复杂度:O((N+K-1)*log(K))
常用算法介绍
面试考察点
- 了解基本数据结构及特点
- 如,有哪些二叉树,各有什么特点
- 表/栈/队列/数需要熟练掌握,深刻理解使用场景
- 红黑树适合用搜索,B+数适合做索引
- 了解常用的搜索/排序算法,以及复杂度和稳定性
- 特别是快速排序和堆排序
- 了解常用的字符串处理算法
- 如,BM使用后缀匹配进行字符串匹配
- 能够分析算法实现的复杂度
- 特别是时间复杂度
- 了解常用算法分类,解决问题的实录和解决哪类问题
加分项
- 能够将数据结构与实际使用场景结合
- 如,介绍红黑树时,结合TreeMap的实现,介绍B+数时,结合Mysql中的索引实现
- 不同算法在业务场景中的应用
- 如,TopK算法在热门排序中的应用
- 面对模糊的题目能够后沟通确认条件和边界
- 书写算法代码前,先讲一下解题思路
- 能够发现解答的一些问题,给出改进思路
真题汇总
- 各种排序算法的实现和复杂度,稳定性
- 二叉树的前中后序遍历
- 翻转句子中单词的顺序
- 用栈模拟队列(或用队列模拟栈)
- 对10亿个数进行排序,限制内存为1G
- 采用分治的思路
- 去掉(或找出)两个数组中重复的数
- 排序和hash两种思路
- 将一颗二叉树转换成其镜像
- 确定一个字符串中的括号是否匹配
- 给定一个开始词,一个结束词,一个字典,如何找到从开始词到结束词的最短单词接龙
- 考虑使用深度优先算法
- 如何查找两个二叉树的最近公共祖先
- 递归与非递归皆可实现