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

 

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

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

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

什么是数据结构?

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

为什么我们需要数据结构?

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

8种常用数据结构

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

1. 数组

数组(Array)大概是最简单,也是最常用的数据结构了。其他数据结构,比如栈和队列都是由数组衍生出来的。

下图展示了1个数组,它有4个元素:

每一个数组元素的位置由数字编号,称为下标或者索引(index)。大多数编程语言的数组第一个元素的下标是0。

根据维度区分,有2种不同的数组:

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

数组的基本操作

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

常见数组代码面试题

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?—?返回队列的第一个元素

常见的队列代码面试题

4. 链表

链表(Linked List)也是线性结构,它与数组看起来非常像,但是它们的内存分配方式、内部结构和插入删除操作方式都不一样。

链表是一系列节点组成的链,每一个节点保存了数据以及指向下一个节点的指针。链表头指针指向第一个节点,如果链表为空,则头指针为空或者为null。

链表可以用来实现文件系统、哈希表和邻接表。

下图展示了一个链表,它有3个节点:

链表分为2种:

  • 单向链表
  • 双向链表

链表的基本操作

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

常见的队列代码面试题

5. 图

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

图分为两种:

  • 无向图
  • 有向图

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

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

遍历图有两周算法

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

常见的图代码面试题

6. 树

树(Tree)是一个分层的数据结构,由节点和连接节点的边组成。树是一种特殊的图,它与图最大的区别是没有循环。

树被广泛应用在人工智能和一些复杂算法中,用来提供高效的存储结构。

下图是一个简单的树以及与树相关的术语:

树有很多分类:

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

其中,二叉树和二叉查找树是最常用的树。

常见的树代码面试题

7. 前缀树

前缀树(Prefix Trees或者Trie)与树类似,用于处理字符串相关的问题时非常高效。它可以实现快速检索,常用于字典中的单词查询,搜索引擎的自动补全甚至IP路由。

下图展示了“top”, “thus”和“their”三个单词在前缀树中如何存储的:

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

常见的树代码面试题

8. 哈希表

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

哈希表通常由数组实现。

哈希表的性能取决于3个指标:

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

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

常见的哈希表代码面试题

参考

关于Fundebug

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

原文地址:https://www.cnblogs.com/williamjie/p/9558015.html

时间: 2024-10-09 22:23:30

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

你应该知道的10种软件工具

除非你是设计小型模拟电子电路,不然这年头离开了计算机的帮助,在嵌入式系统设计中很难做成什么事.我觉得我应该分享一个能帮助我完成工作的软件工具列表.它们大多数都是免费的或者比较便宜的.它们大多数也和软件一起工作.如果你向来不需要设计,阅读或者编辑任何软件,那么你属于读了这篇文章不会从中受益的那一小部分人. 免责声明:"最佳"软件工具通常是一种主张.你可能不同意我的主张,那就取其精华吧. 1. 版本控制系统 不管你工作在一个100人的团队,还是独自一人干活,如果你从事设计,你应该会用到版本

程序员代码面试指南 IT名企算法与数据结构题目最优解 ,左程云著pdf高清版免费下载

下载地址:网盘下载 备用地址:网盘下载 内容简介  · · · · · ·这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮助广大程序员的面试准备做到万无一失.“刷”完本书后,你就是“题王”!__eol__本书采用题目+解答的方式组织内容,并把面试题类型相近或者解法相近的题目尽量放在一起,读者在学习本书时很容易看出面试题解法之间的联系,使知识的学习避免碎片化

2014年你需要知道的6种编程技能(转)

当开始编程工作时,就会有很多关于你必须学习哪种最热门编程语言的讨论.但跟任何程序员进行讨论的时候,他们会告诉你学习语言并不是学习编程的唯一.同样重要的是要理解组成基础编程语言的核心概念,即算法.数据结构以及学习如何使用技术框架,这些现已成为创造一个伟大的技术产品的精髓. 既然你可以在HackerEarth.com上学习和记录你的算法和数据结构,那么在2014年你应该学一学以下这些技术: Rails 业务逻辑!!有经验的web开发人员都很了解构建一个web应用程序的基本功能所花费的时间.Rails

Java_你应该知道的26种设计模式

四. 模板方法模式 Definition: Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Templet Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure. 它包含一个抽象模板和一些具体的模板. 抽象模板中包

你应该知道的24种新兴交互设计

在互联网这个领域,每天都有不计其数的产品诞生,有些产品只是灵光一现,有的却存活了下来,但是不论存活与否,这些产品上总有一些设计细节让我们眼前一亮,下文中分类整理了一些不错的交互形式,希望能给大家带来新的设计灵感. 蓝蓝设计一.导航 1,Google+导航的隐藏功能 Google+作为google进入社交领域的第一个产品,在交互方式有很多亮点,比如在导航的扩展性上,可以把不常用的标签拖放到"更多"中,从而使导航界面更简洁,这个操作进行时的效果也很精致.流畅. 2,导航hover 案例一:

面试前必须要知道的21道Redis面试题

1.使用redis有哪些好处? 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) 支持丰富数据类型,支持string,list,set,sorted set,hash 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除 2.redis相比memcached有哪些优势? memcached所有的值均是简单的字符串,redis作为其替代者

面试须知:通常都要知道的TCP、HTTP知识点

TCP 要说http就绕不开tcp,TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.但是,http是基于tcp协议的. TCP/IP 协议分层模型 物理层将二进制的0和1和电压高低,光的闪灭和电波的强弱信号进行转换 链路层代表驱动 网络层 使用 IP 协议,IP 协议基于 IP 转发分包数据 IP 协议是个不可靠协议,不会重发 IP 协议发送失败会使用ICMP 协议通知失败 ARP 解析 IP 中的 MAC 地址,MAC 地址由网卡出厂提供 IP 还隐含链路层的

5种你未必知道的JavaScript和CSS交互的方法(转发)

5种你未必知道的JavaScript和CSS交互的方法 10/08. 2014 随着浏览器不断的升级改进,CSS和JavaScript之间的界限越来越模糊.本来它们是负责着完全不同的功能,但最终,它们都属于网页前端技术,它们需要相互密切的合作.我们的网页中都有.js文件和.css文件,但这并不意味着CSS和js是独立不能交互的.下面要讲的这五种JavaScript和CSS共同合作的方法你也许未必知道! 用JavaScript获取伪元素(pseudo-element)属性 大家都知道如何通过一个元

一口气说出Redis 5种数据结构及对应使用场景,面试要加分的

整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 更多优选 一口气说出 9种 分布式ID生成方式,面试官有点懵了 3万字总结,Mysql优化之精髓 为了不复制粘贴,我被逼着学会了JAVA爬虫 技术部突然宣布:JAVA开发人员全部要会接口自动化测试框架 写在前边 也当过面试官,面试过不少应聘者,因为是我自己招人自己用,所以我不会看应聘者造火箭的技术有多牛比,只看拧螺丝的手艺瓷不瓷实.毕竟以后是一个整体,拖了大家后