zoukankan      html  css  js  c++  java
  • 八大数据结构常见面试算法

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

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

  • 相关阅读:
    关于CString与VARIANT(CComVariant)之间的转化
    关于_T()说明
    关于COM组件调用
    关于ATML信号定义的理解-1
    关于DOM的事件操作
    javascript(二)
    javascript(一)
    进程.线程.协程之间的区别?
    CSS
    HTML 浅层漫谈
  • 原文地址:https://www.cnblogs.com/jiangcm/p/11256836.html
Copyright © 2011-2022 走看看