代码面试需要知道的8种数据结构(附面试题及答案链接)

原文:The top data structures you should know for your next coding interview

  • 译者:Fundebug

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。
什么是数据结构?
数据结构是计算机存储、组织数据的方式。对于特定的数据结构(比如数组),有些操作效率很高(读某个数组元素),有些操作的效率很低(删除某个数组元素)。程序员的目标是为当前的问题选择最优的数据结构。
为什么我们需要数据结构?
数据是程序的核心要素,因此数据结构的价值不言而喻。无论你在写什么程序,你都需要与数据打交道,比如员工工资、股票价格、杂货清单或者电话本。在不同场景下,数据需要以特定的方式存储,我们有不同的数据结构可以满足我们的需求。

8种常用数据结构:

  1. 数组
  2. 队列
  3. 链表
  4. 前缀树
  5. 哈希表

1. 数组数组(Array)大概是最简单,也是最常用的数据结构了。其他数据结构,比如栈和队列都是由数组衍生出来的。
下图展示了1个数组,它有4个元素:

每一个数组元素的位置由数字编号,称为下标或者索引(index)。大多数编程语言的数组第一个元素的下标是0。
根据维度区分,有2种不同的数组:

  • 一维数组(如上图所示)
  • 多维数组(数组的元素为数组)

数组的基本操作

  • Insert - 在某个索引处插入元素
  • Get - 读取某个索引处的元素
  • Delete - 删除某个索引处的元素
  • Size - 获取数组的长度

常见数组代码面试题

  • 查找数组中第二小的元素
  • 查找第一个没有重复的数组元素
  • 合并2个排序好的数组
  • 重新排列数组中的正数和负数

2. 栈
撤回,即Ctrl+Z,是我们最常见的操作之一,大多数应用都会支持这个功能。你知道它是怎么实现的吗?答案是这样的:把之前的应用状态(限制个数)保存到内存中,最近的状态放到第一个。这时,我们需要栈(stack)来实现这个功能。
栈中的元素采用LIFO (Last In First Out),即后进先出
下图的栈有3个元素,3在最上面,因此它会被第一个移除:

栈的基本操作

  • Push — 在栈的最上方插入元素
  • Pop — 返回栈最上方的元素,并将其删除
  • isEmpty — 查询栈是否为空
  • Top — 返回栈最上方的元素,并不删除

常见的栈代码面试题

  • 使用栈计算后缀表达式
  • 使用栈为栈中的元素排序
  • 检查字符串中的括号是否匹配正确

3. 队列队列(Queue)与栈类似,都是采用线性结构存储数据。它们的区别在于,栈采用LIFO方式,而队列采用先进先出,即FIFO(First in First Out)
下图展示了一个队列,1是最上面的元素,它会被第一个移除:

队列的基本操作

  • Enqueue — 在队列末尾插入元素
  • Dequeue — 将队列第一个元素删除
  • isEmpty — 查询队列是否为空
  • Top — 返回队列的第一个元素

常见的队列代码面试题

  • 使用队列实现栈
  • 倒转队列的前K个元素
  • 使用队列将1到n转换为二进制

4. 链表链表(Linked List)也是线性结构,它与数组看起来非常像,但是它们的内存分配方式、内部结构和插入删除操作方式都不一样。
链表是一系列节点组成的链,每一个节点保存了数据以及指向下一个节点的指针。链表头指针指向第一个节点,如果链表为空,则头指针为空或者为null。
链表可以用来实现文件系统、哈希表和邻接表。
下图展示了一个链表,它有3个节点:

链表分为2种:

  • 单向链表
  • 双向链表

链表的基本操作

  • InsertAtEnd — 在链表结尾插入元素
  • InsertAtHead — 在链表开头插入元素
  • Delete — 删除链表的指定元素
  • DeleteAtHead — 删除链表第一个元素
  • Search — 在链表中查询指定元素
  • isEmpty — 查询链表是否为空

常见的队列代码面试题

  • 倒转1个链表
  • 检查链表中是否存在循环
  • 返回链表倒数第N个元素
  • 移除链表中的重复元素

5. 图图(graph)由多个节点(vertex)构成,节点之间阔以互相连接组成一个网络。(x, y)表示一条边(edge),它表示节点x与y相连。边可能会有权值(weight/cost)

图分为两种:

  • 无向图
  • 有向图

在编程语言中,图有可能有以下两种形式表示:

  • 邻接矩阵(Adjacency Matrix)
  • 邻接表(Adjacency List)

遍历图有两周算法

  • 广度优先搜索(Breadth First Search)
  • 深度优先搜索(Depth First Search)

常见的图代码面试题

  • 实现广度优先搜索
  • 实现深度优先搜索
  • 检查图是否为树
  • 统计图中边的个数
  • 使用Dijkstra算法查找两个节点之间的最短距离

6. 树树(Tree)是一个分层的数据结构,由节点和连接节点的边组成。树是一种特殊的图,它与图最大的区别是没有循环。
树被广泛应用在人工智能和一些复杂算法中,用来提供高效的存储结构。
下图是一个简单的树以及与树相关的术语:

树有很多分类:

  • N叉树(N-ary Tree)
  • 平衡树(Balanced Tree)
  • 二叉树(Binary Tree)
  • 二叉查找树(Binary Search Tree)
  • 平衡二叉树(AVL Tree)
  • 红黑树(Red Black Tree)
  • 2-3树(2–3 Tree)

其中,二叉树和二叉查找树是最常用的树。
常见的树代码面试题

  • 计算树的高度
  • 查找二叉平衡树中第K大的元素
  • 查找树中与根节点距离为k的节点
  • 查找二叉树中某个节点所有祖先节点

7. 前缀树前缀树(Prefix Trees或者Trie)与树类似,用于处理字符串相关的问题时非常高效。它可以实现快速检索,常用于字典中的单词查询,搜索引擎的自动补全甚至IP路由。
下图展示了“top”, “thus”和“their”三个单词在前缀树中如何存储的:

单词是按照字母从上往下存储,“p”, “s”和“r”节点分别表示“top”, “thus”和“their”的单词结尾。
常见的树代码面试题

  • 统计前缀树表示的单词个数
  • 使用前缀树为字符串数组排序

8. 哈希表哈希(Hash)将某个对象变换为唯一标识符,该标识符通常用一个短的随机字母和数字组成的字符串来代表。哈希可以用来实现各种数据结构,其中最常用的就是哈希表(hash table)
哈希表通常由数组实现。
哈希表的性能取决于3个指标:

  • 哈希函数
  • 哈希表的大小
  • 哈希冲突处理方式

下图展示了有数组实现的哈希表,数组的下标即为哈希值,由哈希函数计算,作为哈希表的键(key),而数组中保存的数据即为值(value)

常见的哈希表代码面试题

  • 查找数组中对称的组合
  • 确认某个数组的元素是否为另一个数组元素的子集
  • 确认给定的数组是否互斥

参考

  • Fundebug博客 - Node.js面试题之2017
  • Fundebug博客 - 快速掌握JavaScript面试基础知识(一)
  • Fundebug博客 - 快速掌握JavaScript面试基础知识(二)
  • Fundebug博客 - 快速掌握JavaScript面试基础知识(三)
  • GeeksforGeeks

转载时请注明作者a href="https://fundebug.com/"> Fundebug以及本文地址:https://blog.fundebug.com/2018/08/27/code-interview-data-structure/

中常用的数据结构_代码面试需要知道的8种数据结构(附面试题及答案链接)相关推荐

  1. 每个程序员都必须知道的 8 种数据结构

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 快速介绍8种数据结构 数据结构是一种特殊的组织和存储数据的方式,可 ...

  2. 你需要知道的8种数据结构

    转载:https://blog.csdn.net/ydm19891101/article/details/88785753 为了保证可读性,本文采用意译而非直译.另外,本文版权归原作者所有,翻译仅用于 ...

  3. dijkstra算法代码_数据科学家需要知道的5种图算法(附代码)

    在本文中,我将讨论一些你应该知道的最重要的图算法,以及如何使用Python实现它们. 作者:AI公园 导读 因为图分析是数据科学家的未来. 作为数据科学家,我们对pandas.SQL或任何其他关系数据 ...

  4. 网络工程师常备工具_网络安全工程师应该知道的10种工具

    网络工程师常备工具 If you're a penetration tester, there are numerous tools you can use to help you accomplis ...

  5. 关于MLOps中的数据工程,你一定要知道的.......

    关于MLOps中的数据工程,你一定要知道的....... 背景: 数据工程是什么: MLOps中的数据工程有哪些看点? 1.数据收集 2.数据探索 3.数据处理 4.特征工程 5.暗线 背景: 21世 ...

  6. css修改代码,网站模板修改中常用到的CSS代码详解

    在上一篇文章中,提到了一些修改网站模板中常用到的方法,工具.但其中也牵涉到不到关于CSS样式表的一些知识,对于这些知识,缺乏的还占大多数,今天我就将常用的一些CSS样式表语法整理一下,发出来给大家,希 ...

  7. 在微型计算机中常用的西文字,全国2011年4月高等教育自学考试计算机应用基础试题...

    全国2011年4月计算机应用基础试题及答案,本试卷是为考计算机应用基础考试的考生准备的试题及答案练习. 一.单项选择题(本大题共34小题,每小题1分,共34分) 1.下列语言不需要翻译,计算机就可执行 ...

  8. 每个程序员都必须知道的8种数据结构

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | http://suo.im/6oo92L 快速 ...

  9. MTK面试应该知道的N个问题

    给我一个支点,我可以转动地球 ----阿基米德 对于程序员来说,编程语言就是我们的支点,不同的程序员有不同的支点,而杠杆是需要我们创造的,那些能够成功的吸引人的眼球的设计,都是成功的杠杆,虽然支点不一 ...

  10. MTK面试应该知道的N个问题 .

    给我一个支点,我可以转动地球 ----阿基米德 对于程序员来说,编程语言就是我们的支点,不同的程序员有不同的支点,而杠杆是需要我们创造的,那些能够成功的吸引人的眼球的设计,都是成功的杠杆,虽然支点不一 ...

最新文章

  1. IntelliJ IDEA 使用 Java 11新特性以及Java 8 以来的Java 11新特性介绍
  2. 高压测试平台:高压包产生高电压基本测试参数
  3. 把文件夹下的所有文件打包成一个zip包
  4. 重定向和转发之间的区别
  5. 一直在构建版本_构建系统与代码结构SpringBoot
  6. 深度学习框架PyTorch与TensorFlow,谁更胜一筹?
  7. svd降维 python案例_SVD(奇异值分解)Python实现
  8. Android 源码获取-----在Windows环境下通过Git得到Android源代码
  9. 2021-2025年中国中子发生器行业市场供需与战略研究报告
  10. Linux中的Cron ,任务计划
  11. 进程与线程之间的区别与联系
  12. HTML5+JS调用摄像头
  13. 分享微软一站式示例脚本库 - IT专业人士的省时利器
  14. 什么是html文件?html格式如何打开?(图文讲解)
  15. 一元四次方程欧拉解法的证明
  16. python实现渐变图像
  17. css炫酷标题,分享几个CSS小众但炫酷的技巧
  18. css怎么画小方块,CSS3 小方块矩阵变换动画
  19. 图算法入门4:活动网络-AOE网络和关键路径(critical path)
  20. linux双系统没有引导,Ubuntu双系统没有可引导设备如何解决

热门文章

  1. WIFI内部通话系统技术解决方案
  2. 数据结构——一些小点
  3. 打开前端网页,使用npm run dev报错npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! gmall-admin@1.0.0 dev
  4. layui表格合并单元格多表_layui合并单元格各种办法
  5. 微宝球型机器人功能_《宇宙机器人 无线控制器使用指南》评测:与次世代的美好初恋...
  6. 元素可视区client系列(附实例)
  7. 了解IHttpModule接口事件执行顺便 获取Session
  8. 24、List三个子类的特点
  9. 魅族手机便签里的备忘录内容如何导出到华为手机上?
  10. 大咖说:Java的2017年小惊喜和2018年大展望