程序员面试:八大数据结构及常见面试题

栏目: 数据库 · 发布时间: 6年前

内容简介:几乎所有的问题都需要面试者对数据结构有深刻的理解。无论你是初入职场的新兵(刚从大学或者编程培训班毕业),还是拥有几十年经验的职场老鸟。即便是对于一些非常基础的工作来说,学习数据结构也是必须的。那么,就让我们先从一些基本概念开始入手。

几乎所有的问题都需要面试者对数据结构有深刻的理解。无论你是初入职场的新兵(刚从大学或者编程培训班毕业),还是拥有几十年经验的职场老鸟。

即便是对于一些非常基础的工作来说,学习数据结构也是必须的。那么,就让我们先从一些基本概念开始入手。

程序员面试:八大数据结构及常见面试题

什么是数据结构?

简单地说,数据结构是以某种特定的布局方式存储数据的容器。这种“布局方式”决定了数据结构对于某些操作是高效的,而对于其他操作则是低效的。首先我们需要理解各种数据结构,才能在处理实际问题时选取最合适的数据结构。

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

数据是计算机科学当中最关键的实体,而数据结构则可以将数据以某种组织形式存储,因此,数据结构的价值不言而喻。

无论你以何种方式解决何种问题,你都需要处理数据——无论是涉及员工薪水、股票价格、购物清单,还是只是简单的电话簿问题。

数据需要根据不同的场景,按照特定的格式进行存储。有很多数据结构能够满足以不同格式存储数据的需求。

常见的数据结构

首先列出一些最常见的数据结构,我们将逐一说明:

  • 数组
  • 队列
  • 链表
  • 字典树(这是一种高效的树形结构,但值得单独说明)
  • 散列表(哈希表)

程序员面试:八大数据结构及常见面试题

数组

数组是最简单、也是使用最广泛的数据结构。栈、队列等其他数据结构均由数组演变而来。

每个数据元素都关联一个正数值,我们称之为索引,它表明数组中每个元素所在的位置。大部分语言将初始索引定义为零。

以下是数组的两种类型:

  • 一维数组(如上所示)
  • 多维数组(数组的数组)

数组的基本操作

  • Insert——在指定索引位置插入一个元素
  • Get——返回指定索引位置的元素
  • Delete——删除指定索引位置的元素
  • Size——得到数组所有元素的数量

面试中关于数组的常见问题

  • 寻找数组中第二小的元素
  • 找到数组中第一个不重复出现的整数
  • 合并两个有序数组
  • 重新排列数组中的正值和负值

著名的撤销操作几乎遍布任意一个应用。但你有没有思考过它是如何工作的呢?这个问题的解决思路是按照将最后的状态排列在先的顺序,在内存中存储历史工作状态。这没办法用数组实现。但有了栈,这就变得非常方便了。

可以把栈想象成一列垂直堆放的书。为了拿到中间的书,你需要移除放置在这上面的所有书。这就是LIFO(后进先出)的工作原理。

栈的基本操作

  • Push——在顶部插入一个元素
  • Pop——返回并移除栈顶元素
  • isEmpty——如果栈为空,则返回true
  • Top——返回顶部元素,但并不移除它

面试中关于栈的常见问题

  • 使用栈计算后缀表达式
  • 对栈的元素进行排序
  • 判断表达式是否括号平衡

队列

与栈相似,队列是另一种顺序存储元素的线性数据结构。栈与队列的最大差别在于栈是LIFO(后进先出),而队列是FIFO,即先进先出。

队列的基本操作

  • Enqueue()?——?在队列尾部插入元素
  • Dequeue()?——移除队列头部的元素
  •  isEmpty()——如果队列为空,则返回true
  • Top()?——返回队列的第一个元素

面试中关于队列的常见问题

  • 使用队列表示栈
  • 对队列的前k个元素倒序
  • 使用队列生成从1到n的二进制数

链表

链表是另一个重要的线性数据结构,乍一看可能有点像数组,但在内存分配、内部结构以及数据插入和删除的基本操作方面均有所不同。

链表就像一个节点链,其中每个节点包含着数据和指向后续节点的指针。 链表还包含一个头指针,它指向链表的第一个元素,但当列表为空时,它指向null或无具体内容。

链表一般用于实现文件系统、哈希表和邻接表。

链表内部结构

程序员面试:八大数据结构及常见面试题

程序员面试:八大数据结构及常见面试题

链表包括以下类型:

  • 单链表(单向)
  • 双向链表(双向)

链表的基本操作:

  • InsertAtEnd - 在链表的末尾插入指定元素
  • InsertAtHead - 在链接列表的开头/头部插入指定元素
  • Delete - 从链接列表中删除指定元素
  • DeleteAtHead - 删除链接列表的第一个元素
  • Search - 从链表中返回指定元素
  • isEmpty - 如果链表为空,则返回true

面试中关于链表的常见问题

  • 反转链表
  • 检测链表中的循环
  • 返回链表倒数第N个节点
  • 删除链表中的重复项

图是一组以网络形式相互连接的节点。节点也称为顶点。 一对节点(x,y)称为边(edge),表示顶点x连接到顶点y。边可以包含权重/成本,显示从顶点x到y所需的成本。

图的类型

  • 无向图
  • 有向图

在程序语言中,图可以用两种形式表示:

  • 邻接矩阵
  • 邻接表

常见图遍历算法

  • 广度优先搜索
  • 深度优先搜索

面试中关于图的常见问题

  • 实现广度和深度优先搜索
  • 检查图是否为树
  • 计算图的边数
  • 找到两个顶点之间的最短路径

树形结构是一种层级式的数据结构,由顶点(节点)和连接它们的边组成。 树类似于图,但区分树和图的重要特征是树中不存在环路。

树形结构被广泛应用于人工智能和复杂算法,它可以提供解决问题的有效存储机制。

树数据结构中使用的基本术语

  • Root - 根节点
  • Parent - 父节点
  • Child - 子节点
  •  Leaf - 叶子节点
  • Sibling - 兄弟节点

以下是树形结构的主要类型

  • N元树
  • 平衡树
  • 二叉树
  • 二叉搜索树
  • AVL树
  • 红黑树
  • 2-3树

其中,二叉树和二叉搜索树是最常用的树。

  • 面试中关于树结构的常见问题
  • 求二叉树的高度
  • 在二叉搜索树中查找第k个最大值
  • 查找与根节点距离k的节点
  • 在二叉树中查找给定节点的祖先节点

字典树

字典树,也称为“前缀树”,是一种特殊的树状数据结构,对于解决字符串相关问题非常有效。它能够提供快速检索,主要用于搜索字典中的单词,在搜索引擎中自动提供建议,甚至被用于IP的路由。

面试中关于字典树的常见问题

  • 计算字典树中的总单词数
  • 打印存储在字典树中的所有单词
  • 使用字典树对数组的元素进行排序
  • 使用字典树从字典中形成单词
  • 构建T9字典(字典树+ DFS )

哈希表

哈希法(Hashing)是一个用于唯一标识对象并将每个对象存储在一些预先计算的唯一索引(称为“键(key)”)中的过程。因此,对象以键值对的形式存储,这些键值对的集合被称为“字典”。可以使用键搜索每个对象。基于哈希法有很多不同的数据结构,但最常用的数据结构是哈希表。哈希表通常使用数组实现。

散列数据结构的性能取决于以下三个因素

  • 哈希函数
  • 哈希表的大小
  • 碰撞处理方法

面试中关于哈希结构的常见问题

  • 在数组中查找对称键值对
  • 追踪遍历的完整路径
  • 查找数组是否是另一个数组的子集
  • 检查给定的数组是否不相交

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Erlang趣学指南

Erlang趣学指南

邓辉、孙鸣 / 人民邮电出版社 / 2016-9-7 / 79.00元

这是一本讲解Erlang编程语言的入门指南,内容通俗易懂,插图生动幽默,示例短小清晰,结构安排合理。书中从Erlang的基础知识讲起,融汇所有的基本概念和语法。内容涉及模块、函数、类型、递归、错误和异常、常用数据结构、并行编程、多处理、OTP、事件处理,以及所有Erlang的重要特性和强大功能。一起来看看 《Erlang趣学指南》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具