八大数据结构常见面试算法

八大数据结构分别是:数组,队列,栈,图,链表,树,哈希表,字典树

摘自: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 )

posted @ 2019-08-04 19:25  jiangcm  阅读(267)  评论(0编辑  收藏  举报