我最近在观看牛客网上的左程云讲的算法面试 , 就把其中需要掌握的知识点摘录出来, 当我们把这些知识点都掌握好了 , 学习起来是非常的省力气 !
1、二叉树打印
1.二叉树按层遍历,连同行号一同打印出来
2、二叉树序列化和反序列化
把二叉树记录在文件中的过程叫做二叉树的序列化过程,又叫二叉树的持久化过程 ;
二叉树→字符串 (序列化)
字符串→二叉树 (反序列化)
序列化的方式 :
根据先序遍历序列化
根据中序遍历序列化
根据后序遍历序列化
按层序列化
2、排序算法
冒泡排序
归并排序
希尔排序
计数排序
基数排序
排序算法的稳定性
3、字符串
1.用JAVA实现字符串类型的题目时,需要掌握StringBuffer,StringBuiler类和toCharArray方法
2.需要掌握的概念
回文 子串(连续) 子序列(不连续) 前缀树(Trie树) 后缀树和后缀树组 匹配 字典序
3.需要掌握的操作
与数组有关的操作 : 增删改查
字符串的替换
字符串的旋转
字符串常见题目类型
1.规则判断
判断字符串是否符合整数规则
判断字符串是否符合浮点数规则
判断字符串是否符合回文字符串规则
等等...
2.数字运算
int和long类型表达整数范围有限,所以经常用字符串实现大整数
与大整数相关的加减乘除操作,需要模拟笔算的过程
3.与数组操作有关的类型
数组有关的调整、排序等操作需要掌握
快速排序的划分过程需要掌握和改写
4.字符计数
哈希表
固定长度的数组
滑动窗口问题、寻找无重复字符子串问题 计算变位词问题
5.动态规划类型
最长公共子串
最长公共子序列
最长回文子串
最长回文子序列
6.搜索类型
宽度优先搜索
深度优先搜索
7.高级算法与数据结构解决的问题
Manacher算法解决最长回文子串问题
KMP算法解决字符串匹配问题
前缀树结构
后缀树和后缀数组
通常面试中很少出现 ,因为太难了!
4、队列和栈
栈和队列的基本性质
1.栈是先进后出
2.队列是先进先出的
3.栈和队列在实现结构上可以有数据和链表两种形式
数组结构实现较容易
用链表结构较复杂 ,因为牵扯很多指针操作
栈结构的操作
1.pop操作
2.top或peek操作
3.push操作
4.size操作
队列的基本操作
与栈操作不同的是,push操作为在队头加入元素, 而pop操作是从队列尾部弹出一个元素
双端队列结构为首尾都可以压入和弹出元素
优先级队列为根据元素的优先级值,决定元素的弹出顺序
优先级队列的结构为堆结构 , 并不是线性结构
两种图的遍历方式
深度优先遍历(DFS)可以用栈实现
宽度优先遍历(BFS)可以用队列实现
平常使用的递归函数实际上用到了提供的函数系统栈,递归的过程可以看做递归函数一次进入函数栈的处理过程
所有用递归函数可以做的过程都一定可以用非递归的方式实现
5、链表
链表和数组都是一种线性结构
数组是一段连续的存储空间
链表空间不一定保证连续,为临时分配的
链表的分类
1.按连接方向分类 单链表 双链表
2.按照有环无环分类 普通链表 循环链表
链表问题代码实现的关键
1.链表调整函数的返回值类型,根据要去往往是节点类型
2.处理链表的过程中,先采用画图的方式理清逻辑
3.链表问题对于边界条件讨论要求严格
6、二分搜索
二分搜索常见的应用场景
1.在有序序列中查找一个数
2.并不一定非要在有序序列中才能得到应用
二分搜索常见题目的变化
1.给定处理或查找的对象不同
2.判断条件不同
3.要去返回的内容不同
在有序循环数组中进行二分搜索
7、二叉树
递归和非递归方式实现二叉树的先序、中序和后序遍历
8、位运算
常见的位运算符的操作
9、排列组合
也就是高中的排列组合难度
10、概率
1.在笔试面试中常作为客观问题出现(选择题)
2.在笔试中往往出现概率、期望的计算
3.往往利用古典概率进行计算(组合数学)
概率的应用
1.利用随机来改进著名算法(快速排序)
2.随机数发生器(用给定的随机数发生器构造另一个)
11、大数据
Map-Reduce
12、动态规划
什么是动态规划方法
1、其本质是利用申请的空间来记录每一个暴力搜索的计算结果,下次要用结果的时候直接使用,而不再进行重复的递归过程
2、动态规划规定每一种递归状态的计算顺序,依次进行计算