算法+数据结构=编程
数据结构是以某种特定的布局方式存储数据的容器
数组
一维数组、多维数组
基操
-
Insert——在指定索引位置插入一个元素
-
Get——返回指定索引位置的元素
-
Delete——删除指定索引位置的元素
-
Size——得到数组所有元素的数量
问题
-
找到数组中第一个不重复出现的整数
-
合并两个有序数组
-
重新排列数组中的正值和负值
栈(后进先出)
基操
- Push——在顶部插入一个元素
- Pop——返回并移除栈顶元素
- isEmpty——如果栈为空,则返回true
- Top——返回顶部元素,但并不移除它
问题
-
使用栈计算后缀表达式
-
对栈的元素进行排序
-
判断表达式是否括号平衡
队列(先进先出)
基操
- Enqueue() —— 在队列尾部插入元素
- Dequeue() ——移除队列头部的元素
- isEmpty()——如果队列为空,则返回true
- Top() ——返回队列的第一个元素
问题
-
使用队列表示栈
-
对队列的前k个元素倒序
-
使用队列生成从1到n的二进制数
链表
其中每个节点包含着数据和指向后续节点的指针。 链表还包含一个头指针,它指向链表的第一个元素,但当列表为空时,它指向null或无具体内容
链表一般用于实现文件系统、哈希表和邻接表
单链表(单向)、双向链表(双向)
- InsertAtEnd - 在链表的末尾插入指定元素
- InsertAtHead - 在链接列表的开头/头部插入指定元素
- Delete - 从链接列表中删除指定元素
- DeleteAtHead - 删除链接列表的第一个元素
- Search - 从链表中返回指定元素
- isEmpty - 如果链表为空,则返回true
问题
-
反转链表
-
检测链表中的循环
-
返回链表倒数第N个节点
-
删除链表中的重复项
图
一组以网络形式相互连接的节点
权重/成本,显示从顶点x到y所需的成本
无向图、有向图
邻接矩阵、邻接表
遍历算法:广度优先搜索、深度优先搜索
问题
-
实现广度和深度优先搜索
-
检查图是否为树
-
计算图的边数
-
找到两个顶点之间的最短路径
树
层级式
由顶点(节点)和连接它们的边组成,不存在环路
问题
-
求二叉树的高度
-
在二叉搜索树中查找第k个最大值
-
查找与根节点距离k的节点
-
在二叉树中查找给定节点的祖先节
字典树(前缀树)
快速检索,用于搜索字典中的单词,在搜索引擎中自动提供建议
问题
-
计算字典树中的总单词数
-
打印存储在字典树中的所有单词
-
使用字典树对数组的元素进行排序
-
使用字典树从字典中形成单词
-
构建T9字典(字典树+ DFS )
问题
-
求二叉树的高度
-
在二叉搜索树中查找第k个最大值
-
查找与根节点距离k的节点
-
在二叉树中查找给定节点的祖先节点
哈希表
用于唯一标识对象并将每个对象存储在一些预先计算的唯一索引(称为“键(key)”)中的过程。键值对
- 哈希函数
- 哈希表的大小
- 碰撞处理方法
问题
-
在数组中查找对称键值对
-
追踪遍历的完整路径
-
查找数组是否是另一个数组的子集
-
检查给定的数组是否不相交