前 30 名数据结构和算法面试问题和答案 [针对新人和有经验者]

已发表: 2021-08-31

数据结构和算法是计算机科学与工程领域最重要的学科之一。 如果你参加软件工程面试,你肯定会面临一系列专门针对数据结构和算法的问题——这就是它们的重要性!

算法是计算机科学和数据科学中发生的一切的核心。 从机器学习到人工智能再到区块链——所有技术都基于算法运行。 算法需要数据结构才能发挥作用。 因此,数据结构和算法的综合知识可以帮助你在面试中脱颖而出。

然而,挑战在于 DSA 是一个广泛的领域。 在这里,学习永无止境,总有一些新的发展需要你去了解。 虽然在处理数据结构和算法时必须不断提高技能,但今天,我们将了解一些 DSA 基础知识,这些基础知识将帮助您在技术面试中脱颖而出。

目录

顶级数据结构和算法面试问答

  1. 您对“数据结构”了解多少?

数据结构可以定义为用于系统地定义、存储和访问数据的技术。 它们构成了任何算法中最重要的组成部分。 根据数据结构的类型,它们存储不同类型的数据并以不同的方式访问。 对于返回结果的算法,它需要以有组织且有效的方式对一组数据结构进行操作和操作,以得出最终结果。

  1. 如何区分文件结构和数据结构?

在文件结构中,数据按照标准文件存储策略存储在磁盘上,并且与外部第三方应用程序不兼容。 另一方面,在数据结构中,数据以定制的存储策略存储在磁盘和 RAM 上,并且与外部应用程序高度兼容。

  1. 数据结构的主要类型有哪些?

数据结构大致可以分为两类:

  • 线性:在这种情况下,所有元素都按顺序存储,检索是线性进行的。 该排列是非分层的,每个元素都有一个后继和一个前任。 示例——数组、链表、堆栈、队列等。
  • 非线性:这里的存储不是以线性顺序发生的——也就是说,所有元素不一定只有一个后继和前驱。 相反,非线性数据结构中的元素以非线性方式连接到两个或多个项目。 示例——树、图、堆。

4. 数据结构的一些关键使用领域是什么?

您能想到的所有计算领域都需要数据结构,尤其是算法和算法优化。 以下是数据结构广泛使用的其他一些领域:

  • 操作系统设计
  • 数值分析
  • 机器学习和人工智能
  • 编译器设计与开发
  • 数据库管理
  • 词法分析
  • 图形化编程
  • 搜索和排序算法等。
  1. 解释堆栈数据结构并提及其使用领域。

堆栈只是一个有序列表,它只允许从一端插入和删除——这就是所谓的“顶部”。 它是一个递归数据结构,它有一个指向其“顶部”元素的指针,它让我们知道堆栈的最顶部元素。 基于元素检索策略,堆栈也称为后进先出,因为最后压入堆栈的元素将在顶部,并且将最先被弹出。 以下是堆栈数据结构的一些用途:

  • 回溯
  • 内存管理
  • 函数返回和调用
  • 表达式评估
  1. 可以在堆栈上执行哪些操作?

堆栈数据结构支持以下三种操作:

  • push() — 将一个元素插入到 Stack 的顶部位置。
  • pop()——从栈顶取出一个元素。
  • peek() — 只检查堆栈顶部的元素,而不将其从堆栈中取出。
  1. 你对后缀表达式了解多少?

后缀表达式是运算符跟在操作数后面的表达式。 这在计算术语中非常有益,因为它不需要将任何子表达式分组到括号中,甚至不需要考虑运算符优先级。 表达式 a+b 在后缀中简单地表示为 ab+。

  1. 二维数组元素如何存储在内存中?

二维数组的元素可以通过以下两种方式之一存储在内存中:

  • Row-Major:在这种方法中,首先将数组的所有行连续存储在内存中。 首先,第一行完全存储,然后是第二行,依此类推,直到最后一行。
  • Column-Major:在这种情况下,数组的所有列都连续存储在内存中。 首先,第 1 列完全存储,然后是第 2 列,依此类推。
  1. 定义链表数据结构。

链表是节点的集合——它们是随机存储的对象。 每个节点都有两个内部元素——一个数据字段和一个链接字段。 Data 字段保存特定节点具有的值,而 Link 字段具有指向该节点链接到的下一个节点的指针。 根据情况,链表既可以被认为是线性数据结构,也可以被认为是非线性数据结构。

  1. 链表在哪些方面比数组更好?

链表在以下方面优于数组:

  • 数组大小在运行时是固定的,以后不能修改,但链表可以根据需要实时扩展。
  • 链接列表不是连续存储在内存中的,因此,它们比静态存储的数组更节省内存。
  • 任何链表中可以存储的元素数量仅限于可用的内存空间,而元素的数量受数组大小的限制。
  1. 在 C 编程语言中,您将使用哪个指针来实现异构链表?

异构链表,顾名思义,包含不同的数据类型。 因此,这里不能使用普通的指针。 因此,Void 指针通常用于这种情况,因为它们能够指向任何类型的值。

  1. 什么是双向链表?

顾名思义,双向链表是一个链表,它的节点链接到后续节点和前面的节点。 结果,双向链表的节点具有三个而不是两个字段:

  • 数据字段
  • 下一个指针(用于指向下一个节点)
  • 前一个指针(用于指向前一个节点)
  1. 解释队列数据结构及其一些应用。

队列是一个有序列表,允许从两端插入和删除元素 - 称为 REAR 和 FRONT。 插入从 FRONT 端进行,而从 REAR 端删除。 因此,队列通常被称为先进先出 (FIFO)。 以下是队列作为数据结构的一些广泛应用:

  • 用于单个共享资源(如 CPU、打印机、磁盘等)的等待列表。
  • 对于数据的异步传输,例如文件 IO、套接字、管道。
  • 作为大多数媒体播放器应用程序中的缓冲区。
  • 在操作系统中用于处理中断。
  1. 你能列出使用数组实现队列的一些缺点吗?

使用数组实现队列主要有两个缺点:

  • 内存管理不善,因为数组是静态数据结构,所以用数组实现队列会删除队列的许多功能。
  • 大小问题,因为数组大小是在数组定义期间定义的。 因此,如果我们想向队列中添加比数组大小更多的元素,这是不可能的。
  1. 为了将元素插入循环队列,应满足哪些条件?

以下是有关插入循环队列的一些相关条件:

  • 如果 (rear + 1)%maxsize == front -> 这意味着队列已满 -> 无法再插入。
  • 如果rear != max – 1,则rear 的值将增加到maxsize,并且将在后端插入一个新值。
  • 如果 front != 0 和 back == max -1 –> 这意味着队列未满。 因此,rear 的值被设置为 0,并且一个新元素被插入到循环队列的后端。

16. 什么是出队?

双端队列或双端队列是一组有序的元素,有助于从两端(后端和前端)进行插入和删除。 因此,这甚至比队列数据结构更灵活。

  1. 定义树数据结构并列出一些类型的树。

树是包含各种节点的非线性递归数据结构。 一个特定节点被指定为所有其他节点出现的树的根。 除根外,其他所有节点都称为子节点。 大致有以下类型的树数据结构:

  • 一般树木
  • 二叉树
  • 二叉搜索树
  • 森林
  • 表达式树
  • 比赛树
  1. 冒泡排序是如何工作的?

冒泡排序是最常用的排序算法之一,通过比较相邻元素并根据它们的值交换它们的位置与数组一起使用。 之所以称为冒泡排序,是因为其工作原理的可视化就像从水面上漂浮的气泡和下沉的更大实体。

阅读: C 中的数据结构以及如何使用?

  1. 最快的排序算法是什么?

有许多不同的排序算法可用,如归并排序、快速排序、冒泡排序等。 其中,我们无法选择一种客观上最快的特定算法,因为它们的性能会根据输入数据、算法处理数据后的反应以及数据的存储方式而有很大差异。

  1. 什么是二叉树?

二叉树是一种特殊类型的树,其中每个节点最多可以有两个孩子。 为方便起见,二叉树通常分为三个不相交的集合——根节点、右子树和左子树。

  1. 与 BST 相比,AVL 树如何用于各种操作?

AVL 树是高度平衡的树,因此它们不允许树从任何一侧倾斜。 对高度为 h 的 BST 执行的所有操作所花费的时间为 O(h)。 然而,在最坏的情况下,这可能会继续为 O(n) - BST 变得偏斜。 AVL 通过限制树的高度来帮助消除这种限制。 这样做时,它对所有操作施加了一个上限,使其最大值为 O(log n),其中 n = 节点数。

  1. B树的属性是什么?

m 阶 B-Tree 包含以下属性:

  • M-way 树的所有属性。
  • B_tree 的每个节点最多有 m 个子节点。
  • 除根和叶之外的每个节点都至少有 m / 2 个子节点。
  • 根节点必须至少有 2 个子节点。
  • 所有叶节点必须位于同一水平面上。
  1. 你对图数据结构了解多少?

图 (G) 数据结构可以定义为有序集 G(V,E),其中 V 表示顶点集,E 是形成连接的边。 基本上,图可以被认为是一个循环树,其中节点可以维护它们之间的复杂关系,而不仅仅是父子关系。

  1. 参考图数据结构区分循环、路径和电路。

循环、路径、电路的区别如下:

  • 补丁是由边连接的相邻顶点的顺序,没有任何限制。
  • 循环是一条闭合路径,其中初始顶点与结束顶点相同。 在一个循环中,没有特定的顶点可以被访问两次。
  • 回路就像循环一样,是一条闭合路径,其初始顶点与结束顶点相同。 但是,可以多次访问电路中的任何特定顶点。
  1. 克鲁斯卡尔算法是如何工作的?

Kruskal 算法将图视为森林,将其每个节点视为一棵单独的树。 当且仅当一棵树在所有选项中成本最低且不违反最小生成树 (MST) 的性质时,才称该树连接到另一棵树。

相关:数据结构中的二叉树

  1. Prim 的算法是如何找到生成树的?

Prim 的算法通过将节点视为单个树来工作。 然后,它不断地从给定的图中将新节点添加到生成树中,这些节点必须转换为所需的生成树。

  1. 什么是最小生成树 (MST)?

在加权图中,MST 是具有最小权重的树,但它们跨越所有顶点。

  1. 什么是递归函数?

根据定义,递归函数回调自身或直接调用调用它的函数。 每个递归函数都有一些基本条件,函数停止调用自身。

  1. 什么是插值搜索技术?

插值搜索技术是对二分搜索方法的修改。 插值搜索算法作用于期望值的探测位置。

  1. 什么是哈希?

散列是一种非常有用的技术,用于将一系列键值对转换为数组的索引。 哈希表在创建关联数据存储时派上用场,只需提供其键值对即可在其中轻松找到数据索引!

综上所述

数据结构确实是计算机科学中发生的所有其他事情的基础。 即使是更复杂的计算机科学应用,例如数据科学、机器学习、人工智能、物联网,也都建立在数据结构和算法之上。

因此,如果您是一名初学者,希望在任何新时代领域有所作为,建议您从掌握数据结构和算法开始。 或者,您还可以查看我们为初学者设计的数据科学执行 PG 计划课程从头开始学习,成为数据科学专家。 今天就让自己报名吧!

哪个职位的面试通常会问数据结构和算法问题?

如果您担任任何软件开发或工程角色,肯定会检查您的 DSA 技能。 除此之外,如果您正在申请数据科学工作或想涉足机器学习,您将需要了解 DSA。

我需要了解编程才能理解数据结构和算法吗?

不,不一定。 DSA 大多是抽象的,它完全是关于任何应用程序或程序幕后发生的数学、表示和流程。 虽然在实现算法时拥有编程经验会派上用场,但这绝不是学习 DSA 的先决条件。

数据结构总是静态的吗?

不,数据结构既可以是动态的也可以是静态的,这取决于内存分配的方式。 例如,数组是静态数据结构,因为在定义它们时会为它们分配大量连续的内存。 另一方面,链表是动态数据结构,因为它们没有任何固定大小,并且节点的数量可以根据程序员的要求增加。