0. 前言
简要总结面试或工作中最常用的数据结构和算法以及一些容易忽略但是重要的细节。内容主要包括:数组与字符串;链表;栈与队列;树与图;位操作;智力题;数学与概率;面向对象设计;递归与动态规划;扩展性与存储型限制;排序与查找;测试;C++重要知识点;Java重要知识点;数据库;线程与锁;后续会针对一些典型题目进行题解说明。
1. 数组与字符串
- 散列表:一种将键映射为值从而实现快速查找的数据结构。平均查找时间复杂度为O(1),因此在算法题目中可以考虑使用其来优化复杂度。建议仔细看看Java中关于HashMap的源码,了解其内部原理。
- Arraylist:动态数据,可以自动实现扩容操作。
- StringBuilder:进行字符串拼接操作,需要进行多次字符串拼接时可以考虑使用它。
2. 链表
- 创建链表:可以采用头插法和尾插法的方式,一定要注意指针的指向;
- 删除链表中的结点:单向链表和双向链表的操作,注意指针的变化;注意:空指针;必要时需要更新head和tail指针;
- 快慢指针使用:可以用来获取中间节点;判断链表是否有环等;
3. 栈与队列
- 栈:先进后出的数据结构,可以用来解决括号匹配问题;
- 队列:先进先出的数据结构,有双端队列这种变种,可以在两端进行数据进出;
- 要能够用两个队列实现栈,用两个栈实现队列;具体实现思路自己可以手动在纸上验算;
4. 树与图
- 树需要注意的问题:是二叉树还是二叉排序树(一般对于二叉排序树里面的数据不重复,左子树小于根节点,右子树大于根节点);平衡与不平衡(AVL是严格平衡,B树是不严格平衡);是否是完全二叉树(叶子节点只能出现在最底层)或者满二叉树;
- 二叉树的遍历,要能够分别使用递归和非递归(栈)的方式进行二叉树的前序遍历、中序遍历和后序遍历;
- 了解平衡二叉树和红黑树以及B树的使用场景、特点和区别;
- 单词查找树(trie树)用于前缀问题处理;
- 图的遍历:DFS和BFS,一定要掌握。
// DFS
void dfs(Node root){
if(root == null){
return;
}
// 处理当前节点
visit(root);
// 标记当前节点已经遍历过
//此处需要注意,如果需要回溯,则处理完当前节点后需要还原为false
root.visited = true;
// 对每个相邻的元素都进行查找
for(Node n : root.adjacent){
if(