最佳数据结构常见面试题和答案合集

2021年11月28日22:57:46 发表评论 2,297 次浏览
最佳数据结构常见面试题和答案合集
数据结构面试题解析

数据结构可以是任何允许有效访问和修改的数据组织、管理和存储格式。它是数据值、它们之间的关系以及可应用于数据的各种功能或操作的集合。

数据结构是编程的基本概念,在算法设计中得到了极大的利用。因此,对于任何程序员来说,无论使用何种编程语言,对数据结构有很好的理解都是很重要的。

顶级数据结构面试题和答案合集

任何编程语言面试都会有几个或许多基于数据结构的问题。以下是顶级数据结构面试问题和答案,并为你提供各自的答案:

问题你对数据结构的理解是什么?

:数据结构提供了一种方便的组织和操作数据的方法。简而言之,它允许以有效的方式使用数据。有大量的数据结构,它们中的每一个都适用于一组不同的应用程序。

例如,编译器实现使用哈希表来查找标识符。同样,B-trees 适用于数据库的实现。数据结构实际上应用于所有依赖数据的领域。其中一些最重要的是:

  • 人工智能
  • 编译器设计
  • 数据库管理
  • 图形
  • 数值分析
  • 操作系统
  • 统计分析

问题线性数据结构与非线性数据结构有何不同?

常见的数据结构面试题有哪些?如果数据结构的元素形成序列或线性列表,则称为线性数据结构。另一方面,非线性数据结构是以非线性方式完成节点遍历的数据结构。

数组、链表、堆栈和队列是线性数据结构的例子,而图和树是非线性数据结构的例子。

问题:数据结构有哪些不同的应用?

答:在数据结构中,数据的组织方式可以使其高效使用。数据结构的一些实际应用是:

  • 以表格形式存储数据。例如,一个人的联系方式。这是通过数组完成的。
  • 数组广泛用于图像处理和语音处理。
  • 音乐播放器和图像滑块使用链接列表移动到下一个或上一个项目。
  • Stack 数据结构最常见的应用是撤销操作,最后一项首先出现。
  • A Queue 用于作业调度,用于通信的数据包的排列。
  • 决策树算法使用树,该算法广泛用于机器学习和决策制定。
  • 区块链、密码学等技术都基于哈希算法。
  • 矩阵被广泛用于表示数据和绘制图形,执行统计分析。

问题:解释文件结构和存储结构的区别?

数据结构面试题解析: 

  • 文件结构:硬盘或外部设备(如 USB)存储的数据在手动删除之前保持完整。这种在二级或辅助存储器中的数据表示称为文件结构。 
  • 存储结构:  在这种类型的结构中,数据(变量、常量等)存储在主内存,即 RAM 中,一旦使用这些数据的功能完成,就会被删除。

问题请列举可以对数据结构执行的各种操作。

:以下是可以对数据结构执行的各种操作:

  • 删除 -从数据结构中删除现有元素
  • 插入——向数据结构中添加一个新元素
  • 搜索 -在数据结构中查找元素(如果存在)的位置
  • 排序 –将数据结构的元素排列在:
    • 数字数据的升序或降序
    • 字母数字数据的字典顺序
  • 遍历——访问数据结构的每个元素一次进行处理

问题:解释后缀表达式。

答:在后缀表达式中,运算符固定在操作数之后。一些例子是:

B++(即B+B)
AB+(即A+B)
ABC*+(即A+B*C)
AB*CD*+(即A*B + C*D)

问题你能说出图的 BFS 和 DFS 使用了哪些数据结构吗?

:数据结构面试题和答案合集 - 图的 BFS(广度优先搜索)使用队列。尽管图的 DFS(深度优先搜索)使用堆栈,但也可以使用使用函数调用堆栈的递归来实现。

问题:解释一个多维数组。

答:如果数组有两个以上的维度,则称为多维数组。它们也称为数组数组。例如,一个 3-D 数组看起来像,

int 3darr[10][20][30] 

– 这个数组可以存储 10*20*30 个元素。

赋值

int ndarr[2][3][5] = {{{1,2,4,5},{5,6,7,9}, {6,5,4,3}}, {{1,1 ,3,4}, {2,3,4,6}, {5,6,7,8}}};

访问元素

为了访问每个元素,我们需要三个嵌套循环,比如 i,j,k,这样我们就可以得到 ndarr[i][j][k] 的值

问题请解释堆栈并提及它的一些重要应用。

:堆栈是一种线性数据结构,它遵循 LIFO(后进先出)或 FILO(先进后出)方法来访问元素。Push、pop 和 peek 是堆栈的基本操作。

堆栈的一些值得注意的应用是:

  • 检查表达式中的平衡括号
  • 后缀表达式的求值
  • 在一个数组中实现两个堆栈
  • 中缀到后缀的转换
  • 反转字符串

问题什么是队列?它与堆栈有何不同?

:队列是一种线性结构形式,它遵循 FIFO(先进先出)方法来访问元素。Dequeue、enqueue、front、rear 是队列的基本操作。像堆栈一样,队列可以使用数组和链表来实现。

在堆栈中,最近添加的项目首先被删除。与此相反,在队列的情况下,首先删除最近最少添加的项目。

问题你对二分查找的理解是什么?使用它的最佳场景是什么?

:二分搜索是一种从搜索中间元素开始的算法。如果中间元素不是目标元素,则进一步检查是否继续搜索上半部分的下半部分。该过程一直持续到找到目标元素。

当应用于具有排序或有序元素的列表时,二分搜索效果最佳。

问题你能解释一下如何引用一维数组中的所有元素吗?

:我们可以使用索引循环引用一维数组中的所有元素。计数器从 0 到最大数组大小,比如 n,减一。以循环计数器为数组下标,依次引用一维数组的所有元素。

问题请解释你对先进先出和后进先出的理解?

:FIFO 和 LIFO 都是从数据结构中访问、存储和检索元素的方法。LIFO 代表后进先出。在这种方法中,最近存储的数据是最先提取的数据。

FIFO 是先进先出的缩写。按照这种方法,将首先提取最近存储的数据。

问题:什么是链表数据结构

答:在链表数据中,元素是线性存储的,但物理位置并不给出内存中的顺序;相反,每个元素都指向下一个节点。最后一个指向一个终止符,表示列表的结尾。链表有多种类型——单、双、循环、多。一个简单的单链表可以绘制为:

最佳数据结构常见面试题和答案合集

问题你知道动态内存分配如何帮助管理数据吗?

:动态内存分配有助于存储简单的结构化数据类型。此外,它还可以将单独分配的结构块组合起来,形成按需收缩和膨胀的复合结构。

问题NULL 和 VOID 有什么区别?

:NULL 是一个值,而 VOID 是一个数据类型标识符。分配有 NULL 值的变量表示空值。VOID 用于标识没有初始大小的指针。

问题:如果用C语言实现异构链表,应该使用什么指针类型?

答:我们可以使用空指针。无符号字符指针是另一种选择。这样,我们可以在列表中存储任何数据类型。例子,

  struct a{
   struct a *next;
   s_ize d_size;
  }

问题POP 操作与 PUSH 操作有何不同?

:PUSH 和 POP 操作都与堆栈有关。使用 PUSH 操作将数据添加到堆栈中,而使用 POP 操作检索数据。

问题你能解释一下变量声明是如何影响内存分配的吗?

回答:在变量声明的情况下要分配或保留的内存总量取决于所使用的数据类型。例如,声明一个整数类型变量保留 4 个字节的内存空间,而声明一个双变量保留 8 个字节的可用内存空间。

问题:用 C 编写语法以在单向链表中创建一个节点。

回答: 

newNode = Node(data);    //creates a new node.

问题请解释数据抽象的概念。

数据结构面试题解析:常见的数据结构面试题有哪些?数据抽象有助于将复杂的数据问题分成更小的、易于管理的部分。它首先指定所有涉及的数据对象以及要对其执行的各种操作,而不会过多强调数据的存储方式。

问题:你能写一个 C 程序,在一个循环单列表的开头插入一个节点吗?

答:在循环链表中,最后一个指针指向头(第一个节点)。为此,我们使用指向最后一个节点的外部指针,而 last->next 指向第一个节点。我们采用最后一个节点指针,因为它使我们免于在开头或结尾插入节点时遍历整个列表。 

程序步骤

  • 创建节点 N
  • N->next = last->next
  • last->next = N

代码

 struct Node *addBeginning(struct Node *last, int data) 
{ 
 /*check if list empty, if so create a node, else proceed  as below*/
  // dynamically create a node
  struct Node *N 
        = (struct Node *)malloc(sizeof(struct Node)); 
  // Assign the data. 
  N -> data = data; 
  // last pointer becomes the first node 
  N -> next = last -> next; 
  last -> next = N; 
  return last; 
}

问题如何在二叉搜索树中插入新项目?

:数据结构面试题和答案合集 - 由于二叉搜索树不允许重复,因此要插入的新项目必须是唯一的。假设是,我们将继续检查树是否为空。如果为空,则新项将插入到根节点中。

但是,如果树非空,那么我们将引用新项目的键。当它小于根项的键时,新项将被添加到左子树中。如果新项的键大于根项的键,则将新项插入到右子树中。

问题你能解释一下选择排序是如何在数组上工作的吗?

:选择排序从寻找最小元素开始。它与存在于下标 0 的元素进行切换。接下来,剩余子阵列中的最小元素被定位并与驻留在下标 1 中的元素进行切换。

重复上述过程,直到最大元素放置在下标 n-1 处,其中 n 表示给定数组的大小。

问题:编写伪代码对二叉树进行中序遍历。

答:中序遍历是深度优先遍历。该方法被递归调用以在二叉树上执行遍历。代码如下:

struct btnode
{
    struct btnode *left;
    struct btnode *right;
}
*root = NULL, *temp = NULL;
void inorder(struct btnode *temp)
{
    if (root == NULL)
    {
        printf("Root is empty");
        return;
    }
    if (temp->left != NULL)    
        inorder(temp->left);
    if (temp->right != NULL)    
        inorder(t->right);
}

问题:编写递归 C 函数来计算二叉树中存在的节点数。

回答: 

static int counter = 0;
int countnodes(struct node *root)
{
    if(root != NULL)
    {
        countnodes(root->left);
        counter++;
        countnodes(root->right);
    }
    return counter;
}

问题:编写一个递归 C 函数来计算二叉树的高度。

答:递归求高度,求左右子树高度的最大值,然后与根相加。 

struct node
{
int data;
struct node *left;
struct node *right;
};
int height(struct node *node)
{
if(node == NULL)
return 0;
else
{
int l_side;
int r_side;
l_side = height(node -> left);
r_side = height(node -> right);
if(l_side > r_side)
{
 return l_side + 1;
}
else
 return r_side + 1;
}

}

问题你知道有符号数和无符号数是如何影响内存的吗?

:对于有符号数,第一位保留用于表示该数是正数还是负数。因此,它用于存储值少了一点。与有符号数不同,无符号数具有可用于存储数字的所有位。

上述效果可以在有符号和无符号数字可用的值范围中看到。虽然无符号 8 位数字的范围是 0 到 255,但 8 位有符号数字的范围从 -128 到 127。

问题所有声明语句都会导致固定的内存保留吗?

:除了指针,所有声明语句都会导致固定的内存预留。指针声明不是分配内存来存储数据,而是分配内存来存储指针变量的地址。

对于指针,数据的实际内存分配发生在运行时。

问题数组与堆栈有何不同?

数据结构面试题解析:堆栈遵循 LIFO 方法。这意味着数据操作遵循特定的顺序,其中最新的数据元素是最先检索的数据元素。

与堆栈不同,数组不遵循任何特定顺序来添加或检索数据。通过引用数组索引来添加或检索数组中的元素。

问题你对 AVL 树的理解是什么?

:常见的数据结构面试题有哪些:AVL 树是 BST(二叉搜索树)的一种,它始终处于部分平衡状态。平衡的度量由子树距 AVL 树根节点的高度差给出。

问题请解释数组与链表有何不同?

:以下是数组和链表之间的各种差异:

  • 附加内存——对于属于链表的每个元素,都需要额外的内存空间来存储指针。数组没有这样的要求
  • 缓存——相对于链表,数组具有更好的缓存局部性,可以显着提升各种场景下的性能
  • 插入和删除 -在链表中添加或删除元素很容易。为数组插入和删除元素比较昂贵
  • 随机访问——链表不允许随机访问,而数组允许
  • 大小 -虽然数组的大小是固定的,但链表的大小是动态的

问题你对中缀、前缀和后缀符号的理解是什么?

回答

  • 中缀表示法——运算符写在操作数之间。这是书写表达式的标准方式。例如,A * (B + C) / D
  • Postfix Notation/Reverse Polish Notation –操作符写在操作数之后,因此得名。例如,ABC + * D /
  • Prefix Notation/Polish Notation –运算符写在操作数之前。/* A + BCD 是前面提到的后缀表示法示例的前缀表示法

问题请解释链表及其各种类型。

:在链表中,每个元素都是一个不同的对象。与数组一样,链表是一种线性类型的数据结构。除了数据之外,链表的每个元素都包含对下一个元素的引用。各种类型的链表是:

  • 单向链表——每个节点存储链表中下一个节点的地址或引用,留给存储NULL的最后一个节点
  • 双向链表——每个节点保持两个引用。一个指向下一个节点,另一个指向上一个节点
  • 循环链表——在这种类型的链表中,所有节点都连接成一个圆圈。因此,最后没有 NULL。循环链表可以是单循环链表,也可以是双循环链表

问题你将如何使用队列实现堆栈,反之亦然?

:可以使用两个队列来实现堆栈。此外,有两种选择;要么使推送操作成本高昂,要么使弹出操作成本高昂。

一个队列也可以用两个堆栈来实现。此外,有两种选择;要么使 enQueue 操作成本高昂,要么使 deQueue 操作成本高昂。

问题哪些数据结构用于实现 LRU 缓存?

:数据结构面试题和答案合集 - 通过按使用顺序组织项目,最近最少使用或 LRU 缓存允许快速识别最长时间未使用的项目。两种数据结构用于实现 LRU 缓存:

  • 队列 -使用双向链表实现。队列的最大大小取决于可用帧的总数,即缓存大小。最近使用的页面将靠近队列的后端,而最近最少使用的页面将靠近队列的前端
  • Hashmap——以页码为键,以对应队列节点的地址为值

问题你能否简要说明开发算法的各种方法?

:开发算法有 3 种主要方法:

  • 分而治之——涉及将整个问题分解为多个子问题,然后独立解决每个子问题
  • 动态规划 -与分治法相同,不同之处在于所有子问题都一起解决
  • 贪婪方法——通过选择下一个最佳选项来寻找解决方案

问题请列举一些贪婪算法和分治算法的例子。

回答:遵循贪婪方法的一些算法示例是:

  • Dijkstra 的最小生成树
  • 图表 – 地图着色
  • 图 – 顶点覆盖
  • 作业调度问题
  • 背包问题
  • Kruskal 的最小生成树
  • Prim 的最小生成树
  • 旅行推销员

以下是分治法的一些值得注意的例子:

  • 二分查找
  • 最近的一对(或点)
  • 归并排序
  • 快速排序
  • 施特拉森矩阵乘法

问题插入排序与选择排序有何不同?

:插入和选择方法都维护两个子列表,排序的和未排序的。每个从未排序的子列表中取出一个元素并将其放入已排序的子列表中。两种排序过程的区别在于对当前元素的处理。

插入排序获取当前元素并将其放置在已排序子列表中的适当位置。另一方面,选择排序在未排序的子列表中搜索最小值并将其替换为当前元素。

问题你对shell排序的理解是什么?

:shell 排序可以理解为插入排序的一种变体。该方法根据一些间隙变量将整个列表划分为更小的子列表。然后使用插入排序对每个子列表进行排序。

问题你能解释一下树的遍历吗?

:访问树的所有节点的过程称为树遍历。它总是从根节点开始,有以下三种方法:

  • 有序遍历
  • 先序遍历
  • 后序遍历

问题请解释一棵生成树。一个图最多可以有多少棵生成树?

:生成树是图的一个子集,它具有所有顶点但边数尽可能少。生成树既不能断开连接,也没有循环。

图可以拥有的最大生成树数取决于图的连接程度。具有 n 个节点的完整无向图最多可以有 nn-1 个生成树。

问题克鲁斯卡尔算法如何工作?

:Kruskal 算法将图视为森林,将其中的每个节点视为单独的树。一棵树只有在以下情况下才能连接到另一棵树:

  • 在所有可用选项中成本最低
  • 不违反MST 属性

问题你对数据结构中的堆的理解是什么?

:堆数据结构是一种特殊的平衡二叉树,其中根节点键与其子节点进行比较并进行相应排列。堆数据结构可以有两种类型:

  • Min-Heap –父节点的键值小于其子节点
  • Max-Heap –父节点的键值大于其子节点

问题请解释递归。

:允许函数或模块调用自身的能力称为递归。函数 f 要么直接调用自身,要么调用另一个函数“g”,后者又调用函数“f”。函数 f 被称为递归函数,它遵循递归特性:

  • 基本标准——递归函数在何处停止调用自身
  • 渐进式方法——递归函数试图在每次迭代中满足基本标准

问题你能解释一下河内塔的问题吗?

答案:河内塔是一个数学谜题,由三个塔(或桩)和一个以上的环组成。每个环的大小各不相同,并且彼此堆叠在一起,以便较大的环位于较小的环下方。

河内塔问题的目标是在不破坏属性的情况下将圆盘塔从一个钉子移动到另一个钉子。

问题BFS(广度优先搜索)和 DFS(深度优先搜索)算法如何工作?

:BFS 算法在横向运动中遍历一个图。它使用队列来记住下一个顶点,以便在任何迭代中出现死胡同时开始搜索。

DFS 算法在深度运动中遍历图。它使用堆栈来记住下一个顶点,以便在迭代中遇到死胡同时开始搜索。

问题你对哈希的理解是什么?

:常见的数据结构面试题有哪些?将一系列键值转换为数组索引范围的技术称为散列。可以使用哈希表创建关联数据存储,其中可以通过提供相应的键值找到数据索引。

问题请解释一个 MST(最小生成树)。另外,解释 Prim 的算法如何找到最小生成树。

数据结构面试题解析:MST 或最小生成树是加权图中的生成树,它具有所有可能生成树的最小权重。每个节点都被Prim 算法视为一棵树,同时从可用图中向生成树添加新节点。

问题你能解释一下插值搜索技术吗?

:插值搜索技术是二分搜索的增强变体。它作用于所需值的探测位置。

问题你将如何检查给定的二叉树是否是 BST?

:只需对给定的二叉树进行中序遍历,同时跟踪前一个键值。如果当前键值更大,则继续,否则返回false。如果二叉树的中序遍历被排序,则二叉树是BST。

数据结构面试题和答案合集概括

这总结了 50 个顶级数据结构面试问题的列表。希望进一步了解你的数据结构知识?这些 DS 面试问题在其他编程面试中也很有帮助。试试这些最好的数据结构教程,并按照这个 Udemy 课程来破解顶级编程公司的面试。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: