Java 程序员必须掌握的 8 道数据结构面试题,你会几道

转载自  Java 程序员必须掌握的 8 道数据结构面试题,你会几道

瑞士计算机科学家Niklaus Wirth在1976年写了一本书,名为《算法+数据结构=编程》。

40多年后,这个等式仍被奉为真理。这就是为什么在面试过程中,需要考察软件工程师对数据结构的理解。

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

有些面试题会明确提及某种数据结构,例如,“给定一个二叉树。”而另一些则隐含在面试题中,例如,“我们希望记录每个作者相关的书籍数量。”

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

 

什么是数据结构?

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

 

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

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

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

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

 

常见的数据结构

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

  • 数组

  • 队列

  • 链表

  • 字典树(这是一种高效的树形结构,但值得单独说明)

  • 散列表(哈希表)

 

数组

数组是最简单、也是使用最广泛的数据结构。栈、队列等其他数据结构均由数组演变而来。下图是一个包含元素(1,2,3和4)的简单数组,数组长度为4。

每个数据元素都关联一个正数值,我们称之为索引,它表明数组中每个元素所在的位置。大部分语言将初始索引定义为零。关注Java技术栈微信公众号,回复"面试"获取更多博主精心整理的面试题。

以下是数组的两种类型:

  •  一维数组(如上所示)

  • 多维数组(数组的数组)

数组的基本操作

  • Insert——在指定索引位置插入一个元素

  • Get——返回指定索引位置的元素

  • Delete——删除指定索引位置的元素

  • Size——得到数组所有元素的数量

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

  • 寻找数组中第二小的元素

  • 找到数组中第一个不重复出现的整数

  • 合并两个有序数组

  • 重新排列数组中的正值和负值

     

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

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

下图是包含三个数据元素(1,2和3)的栈,其中顶部的3将被最先移除:

 

栈的基本操作

  • Push——在顶部插入一个元素

  • Pop——返回并移除栈顶元素

  • isEmpty——如果栈为空,则返回true

  • Top——返回顶部元素,但并不移除它

面试中关于栈的常见问题

  • 使用栈计算后缀表达式

  • 对栈的元素进行排序

  • 判断表达式是否括号平衡

     

队列

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

一个完美的队列现实例子:售票亭排队队伍。如果有新人加入,他需要到队尾去排队,而非队首——排在前面的人会先拿到票,然后离开队伍。

下图是包含四个元素(1,2,3和4)的队列,其中在顶部的1将被最先移除:

 

移除先入队的元素、插入新元素

队列的基本操作

  • Enqueue() —— 在队列尾部插入元素

  • Dequeue() ——移除队列头部的元素

  • isEmpty()——如果队列为空,则返回true

  • Top() ——返回队列的第一个元素

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

  • 使用队列表示栈

  • 对队列的前k个元素倒序

  • 使用队列生成从1到n的二进制数

     

链表

链表是另一个重要的线性数据结构,乍一看可能有点像数组,但在内存分配、内部结构以及数据插入和删除的基本操作方面均有所不同。关注Java技术栈微信公众号,回复"面试"获取更多博主精心整理的面试题。

链表就像一个节点链,其中每个节点包含着数据和指向后续节点的指针。 链表还包含一个头指针,它指向链表的第一个元素,但当列表为空时,它指向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的节点

  • 在二叉树中查找给定节点的祖先节点

 

字典树(Trie)

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

以下是在字典树中存储三个单词“top”,“so”和“their”的例子:

 

这些单词以顶部到底部的方式存储,其中绿色节点“p”,“s”和“r”分别表示“top”,“thus”和“theirs”的底部。

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

  • 计算字典树中的总单词数

  • 打印存储在字典树中的所有单词

  • 使用字典树对数组的元素进行排序

  • 使用字典树从字典中形成单词

  • 构建T9字典(字典树+ DFS )

 

哈希表

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

哈希表通常使用数组实现。

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

  • 哈希函数

  • 哈希表的大小

  • 碰撞处理方法

下图为如何在数组中映射哈希键值对的说明。该数组的索引是通过哈希函数计算的。

 

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

  • 在数组中查找对称键值对

  • 追踪遍历的完整路径

  • 查找数组是否是另一个数组的子集

  • 检查给定的数组是否不相交

以上是在编程面试之前你应该知晓的八大数据结构,关注Java技术栈微信公众号,回复"面试"获取更多博主精心整理的面试题。

(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue.js 01 模板语法

文章目录vue插值vue指令vue插值 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&…

如何使用bootstrap实现轮播图?

大家好&#xff0c;我是雄雄&#xff0c;今天给大家分享的是如何使用bootstrap实现轮播图&#xff0c;美观大方且兼容性还好&#xff01;轮播图就不做过多的介绍了&#xff0c;大家都知道&#xff0c;只是轮播的实现有多种方式&#xff0c;例如使用纯js写&#xff0c;费时费力&…

Visual Studio Code: 利用 MSSQL 插件创建数据库 IDE

尽管面对繁重的 .NET 开发任务 Visual Studio 仍是我的首选 IDE&#xff0c;但我却已深深迷恋上 Visual Studio Code (VS Code)&#xff0c;无论我使用的语言是 C#、JavaScript 还是 Node&#xff0c;也无论我使用的操作系统是 Windows 还是 macOS。 当然&#xff0c;VS Code 及…

binarySearch与IndexOf的那些事儿~

大家好&#xff0c;我是雄雄&#xff0c;今天我们来看看java中的binarySearch方法&#xff01;我们都知道&#xff0c;如果我们想要在一个集合中查找某个元素所在的位置时&#xff0c;可以使用list类自带的indexOf方法&#xff0c;简单方便还快捷。不过&#xff0c;Collections…

两张趣图助你理解 HTTP 状态码

转载自 两张趣图助你理解 HTTP 状态码 HTTP状态码&#xff08;HTTP Status Code&#xff09;是用以表示网页服务器HTTP响应状态的3位数字代码。 我们可以通过查看HTTP状态码来判断服务器状态&#xff0c;常见的有404 、502等&#xff1b;但是其他不是很常见的状态码都代表什…

Java中的binarySearch方法

大家好&#xff0c;我是雄雄&#xff0c;今天我们来看看java中的binarySearch方法&#xff01; 前言&#xff1a;我们都知道&#xff0c;如果我们想要在一个集合中查找某个元素所在的位置时&#xff0c;可以使用list类自带的indexOf方法&#xff0c;简单方便还快捷。不过&…

ASP.NET Core 开源论坛项目 NETCoreBBS

ASP.NET Core 轻量化开源论坛项目&#xff0c;ASP.NET Core Light forum NETCoreBBS 采用 ASP.NET Core EF Core Sqlite Bootstrap 开发。 GitHub: https://github.com/linezero/NETCoreBBS 开发 git clone https://github.com/linezero/NETCoreBBS.git使用 Visual Studi…

使用相对长度单位em布局网页内容

顺便问一下哈&#xff1f;那个辣椒酱大家感觉怎么样&#xff0c;你们也买了也尝了&#xff0c;是不是该反馈反馈啦~~如果还有想要的&#xff0c;可以联系我呐&#xff01;原文地址&#xff1a;自从有了这款辣椒酱&#xff0c;拌饭再也不用老干妈前言&#xff1a;在页面开发中&a…

史上最全的 MySQL 高性能优化实战总结

转载自 史上最全的 MySQL 高性能优化实战总结 一、前言 MySQL 对于很多 Linux 从业者而言&#xff0c;是一个非常棘手的问题&#xff0c;多数情况都是因为对数据库出现问题的情况和处理思路不清晰。在进行 MySQL 的优化之前必须要了解的就是 MySQL 的查询过程&#xff0c;很…

.NET Core快速入门教程 3、我的第一个.NET Core App (CentOS篇)

一、前言 本篇开发环境&#xff1f;1、操作系统&#xff1a;CentOS7&#xff08;因为ken比较偏爱CentOS7&#xff09;2、SDK版本&#xff1a;.NET Core 2.0 Preview你可能需要的前置知识1、了解如何通过Hyper-V安装CentOS虚拟机2、了解CentOS7基础命令/常用命令 二、安装 .NE…

RPC(远程过程调用)

1、RPC和HTTP对比 1.1 具体实现 RPC&#xff1a;可以基于TCP协议&#xff0c;也可以基于HTTP协议。 HTTP&#xff1a;基于HTTP协议 1.2 效率 RPC&#xff1a;自定义具体实现可以减少很多无用的报文内容&#xff0c;使得报文体积更小。 HTTP&#xff1a;如果是HTTP 1.1 报文中很…

【2018.3.24】模拟赛之四-ssl2548 旋转【暴力模拟】

正题 大意 给出一块黑块和白块组成的版&#xff0c;将其旋转90后和之前的黑块叠加&#xff0c;求最初始和每次旋转后的黑块数。 解题思路 暴力模拟不解释 代码 #include<cstdio> #include<iostream> using namespace std; int n,s; char c[51][51],a[51][51];…

使用相对长度单位rem布局网页内容

前言&#xff1a;上篇我们提到了相对单位em的用法&#xff0c;知道了em的概念&#xff0c;即是一个相对的单位&#xff0c;也知道了em的值不是固定的&#xff0c;p标签里的em和p里面的div下面的1em的px值并不是一样的。具体是多少呢&#xff1f;那就得看一下父级元素的值了&…

告诉你,Spring Boot 真是个牛逼货

转载自 告诉你&#xff0c;Spring Boot 真是个牛逼货 现在 Spring Boot 非常火&#xff0c;各种技术文章&#xff0c;各种付费教程&#xff0c;多如牛毛&#xff0c;可能还有些不知道 Spring Boot 的&#xff0c;那它到底是什么呢&#xff1f;有什么用&#xff1f;今天给大家…

集合还有这么优雅的运算法?

前言&#xff1a;在初中数学&#xff0c;我们也有集合的概念&#xff0c;非但如此&#xff0c;还有集合中的一些运算&#xff0c;例如交集、并集、差集等&#xff0c;那么我们java中的集合是否有这样的运算呢&#xff1f;今天我们就一起来看看&#xff01;01并集就是将两个集合…

.NET Core快速入门教程 2、我的第一个.NET Core App(Windows篇)

一、前言 本篇开发环境&#xff1f;1、操作系统&#xff1a; Windows 10 X642、SDK&#xff1a; .NET Core 2.0 Preview 二、安装 .NET Core SDK 1、下载 .NET Core下载地址&#xff1a;https://www.microsoft.com/net/download/core根据自己电脑情况选择对应版本即可.NET C…

【2018.3.24】模拟赛之六-ssl2550 重要人物【图论,最短路,SPFA】

正题 大意 有一个大人物&#xff0c;它要从经过一些地方&#xff0c;他所在的路会被封闭&#xff08;不可以进入&#xff0c;可以出&#xff09;。你要从一个点到到另一个点&#xff0c;求最短时间。 解题思路 求出每条路的封闭时间&#xff0c;然后SPFA 代码 #include<…

今天 ,给大家变个魔术!!!

前言&#xff1a;在对网页进行布局时&#xff0c;当我们设置div的的宽为固定宽时&#xff0c;理论上&#xff0c;内容是不会超出div的&#xff0c;那你有没有见过内容超出div固定宽度的情况呢&#xff1f;今天我们就来看看到底是怎么一回事&#xff1f;看分析之前&#xff0c;我…

Google的面试题长啥样

转载自 Google的面试题长啥样 本文翻译自Google工程师/面试官Alex Golec的文章&#xff1a;Google Interview Questions Deconstructed: The Knight’s Dialer&#xff1b; 来源&#xff1a;实验楼&#xff0c;翻译&#xff1a;实验楼扫地阿姨 原文&#xff1a;https://medium…

Autofac+Castle实现AOP事务

一、前言 最近公司新项目&#xff0c;需要搭架构进行开发&#xff0c;其中需要保证事务的一致性&#xff0c;经过一番查找&#xff0c;发现很多博文都是通过Spring.Net、Unity、PostSharp、Castle Windsor这些方式实现AOP的。但是这不是我想要的&#xff0c;因此一番查找后&am…