八大数据结构常见面试算法
八大数据结构分别是:数组,队列,栈,图,链表,树,哈希表,字典树
摘自:https://baijiahao.baidu.com/s?id=1609200503642486098&wfr=spider&for=pc
1.数组
①寻找数组中第二小的元素
方法一:由小到大排序,然后取第二个元素
方法二:遍历2次,第一次找打最小的元素,第二次用其他元素与这个元素相减,差最小且不为0的+最小元素就是第二小的元素
②找到数组中第一个不重复出现的整数
双重循环。拿每个元素个其他元素比较,找不与其他元素相等的元素。
③合并两个有序数组
先将2个数组从小到大排序,new一个新数组,长度得>=这两个数组长度之和,写2个方法分别循环这两个数组,比较取出来得值的大小,把较小的先插入新数组里(比如说a[i] < b[j],则插入a数组的a[i]),然后再取a数组的a[i+1]和b数组的b[j]比较,插入较小的,以此类推。
④重新排列数组中的正值和负值(注意:是排列,不是排序,而在正数复数各自的内部中,是需要排序的,正数由大到小排列,复数由小到大排列)
例如,如果输入数组是[-1,2,-3,4,5,6,-7,8,9],那么输出应为[9,-7,8,-3,5, - 1,2,4,6]
可以将正数和负数分离,然后将正数和负数依次交换。
2.队列
①使用队列表示栈
- push(x) -- 元素 x 入栈:直接放就行
- pop() -- 移除栈顶元素:假设队列长度为n,把n -1的元素放到另一个队列里,然后把原队列情况,再把元素放回来
- top() -- 获取栈顶元素:和pop一样,只不过不清空而已
- empty() -- 返回栈是否为空:就直接查。
②对队列的前k个元素倒序
③使用队列生成从1到n的二进制数
3.栈
①使用栈计算后缀表达式
例如:a*b+(c-d/e)*f,他的后缀表达式是:ab*cde/-f*+
(1) 初始化栈,栈顶指针为空;
(2) 遇到操作数a,入栈;
(3) 遇到操作数b,入栈;
(4) 遇到操作符*,弹出栈中两个元素,计算结果入栈;
(5) 遇到操作数c,入栈;
(6) 遇到操作符d,入栈;
(7) 遇到操作数e,入栈;
(8) 遇到运算符/,弹出栈中两个元素,计算结果入栈;
(9) 遇到操作符-,弹出栈中两个元素,计算结果入栈;
(10) 遇到操作数f,入栈;
(11) 遇到操作符*,弹出栈中两个元素,计算结果入栈;
(12) 遇到操作符+,弹出栈中两个元素,计算结果入栈;
②对栈的元素进行排序
需要一个临时栈,临时栈的目的就是保证降序排列,原始栈里面的所有元素永远比临时栈里面的栈顶元素大。
具体实现步骤:
(1)申请一个数据栈s用来存放numbers中的数据,再申请一个临时栈tmp用来存放临时数据
(2)比较s栈弹出的栈顶元素top与tmp的栈顶元素,并进行相应的操作,以确保tmp栈中的数据是降序的,具体比较过程如下:
当s栈不为空时:
若tmp栈为空或者top<=tmp.top() 就将top元素push到tmp栈中
若tmp栈不为空并且top>tmp.top() 将tmp中比top小的元素都push到s栈中,最后再将top元素push到tmp栈中
(3)此时tmp栈中的栈顶元素为最小值,将tmp栈中的元素依次弹出到s栈中,再将s栈中的元素依次弹出并保存到一个vector数组中。
③判断表达式是否括号平衡
思路就是遇见左括号就放进栈里,遇见右括号就和栈顶元素比较,如果不是同一类型的括号或者没有栈顶元素,则不平衡
4.图
①实现广度和深度优先搜索
②检查图是否为树
③计算图的边数
④找到两个顶点之间的最短路径
5.链表
①反转链表
https://blog.csdn.net/qq_38664371/article/details/80824283
简单来说就是从头节点的下一个节点开始循环,将每个节点的指针指向它的前一个节点,头节点是真有指针没有值,尾节点是只有值没有指针,这样子反转后,头节点的下一个节点的指针肯定是空的,因为头节点没有值,所以就变成了尾指针,而尾节点是没有下一个节点的,所以就需要一个新的只有指针没有值的节点指向它,就理所当然变成头指针。
②检测链表中的循环
③返回链表倒数第N个节点
④删除链表中的重复项
6.树
①求二叉树的高度
②在二叉搜索树中查找第k个最大值
③查找与根节点距离k的节点
④在二叉树中查找给定节点的祖先节点
7.哈希表
①在数组中查找对称键值对
②追踪遍历的完整路径
③查找数组是否是另一个数组的子集
④检查给定的数组是否不相交
8.字典树
①计算字典树中的总单词数
②打印存储在字典树中的所有单词
③使用字典树对数组的元素进行排序
④使用字典树从字典中形成单词
⑤构建T9字典(字典树+ DFS )