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

107 篇文章 1 订阅

https://blog.csdn.net/Fundebug/article/details/82106808

译者按: 搞定面试,不要急着刷题,先弄懂什么是数据结构!

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

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

这里写图片描述

1976年,一个瑞士计算机科学家写一本书《Algorithms + Data Structures = Programs》。即:算法 + 数据结构 = 程序。40多年过去了,这个等式依然成立。

很多代码面试题都要求候选者深入理解数据结构,不管你来自大学计算机专业还是编程培训机构,也不管你有多少年编程经验。有时面试题会直接提到数据结构,比如“给我实现一个二叉树”,然而有时则不那么明显,比如“统计一下每个作者写的书的数量”。
什么是数据结构?

数据结构是计算机存储、组织数据的方式。对于特定的数据结构(比如数组),有些操作效率很高(读某个数组元素),有些操作的效率很低(删除某个数组元素)。程序员的目标是为当前的问题选择最优的数据结构。
为什么我们需要数据结构?

数据是程序的核心要素,因此数据结构的价值不言而喻。无论你在写什么程序,你都需要与数据打交道,比如员工工资、股票价格、杂货清单或者电话本。在不同场景下,数据需要以特定的方式存储,我们有不同的数据结构可以满足我们的需求。
8种常用数据结构

    数组
    栈
    队列
    链表
    图
    树
    前缀树
    哈希表

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

关于Fundebug

Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了6亿+错误事件,得到了Google、360、金山软件等众多知名用户的认可。欢迎免费试用!

版权声明:
转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2018/08/27/code-interview-data-structure/
---------------------  
作者:Fundebug  
来源:CSDN  
原文:https://blog.csdn.net/Fundebug/article/details/82106808  
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些常见的数据结构面试问题及其答案: 1. 什么是数据结构数据结构是指用于组织和存储数据的方式和方法,它涉及到数据的存储、访问和操作。 2. 请列举一些常见的数据结构。 常见的数据结构包括数组、链表、栈、队列、树、图和哈希表等。 3. 什么是数组? 数组是一线性数据结构,它由一组连续的内存单元组成,用于存储相同类型的数据。 4. 什么是链表? 链表是一线性数据结构,由一系列节点组成。每个节点包含数据和指向下一个节点的指针。 5. 什么是栈? 栈是一先进后出(LIFO)的数据结构,只允许在栈顶进行插入和删除操作。 6. 什么是队列? 队列是一先进先出(FIFO)的数据结构,允许在队尾进行插入操作,在队头进行删除操作。 7. 什么是树? 树是一非线性数据结构,由节点和边组成。每个节点可以有零个或多个子节点。 8. 什么是图? 图是一非线性数据结构,由一组节点和边组成。节点可以是任意对象,边表示节点之间的连接关系。 9. 什么是哈希表? 哈希表是一以键值对形式存储数据的数据结构,通过哈希函数将键映射到存储位置。 10. 请解释时间复杂度和空间复杂度。 时间复杂度是算法执行所需要的时间量度,通常用大 O 表示法表示。空间复杂度是算法执行所需要的额外空间量度。 这些问题只是一部分常见的数据结构面试问题,希望对你有所帮助。如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值