Android开辟者口试应该知道数据结构以及其他内容

分享
计算机软件开发 2024-9-16 11:48:32 20 0 来自 中国
糟糕的步伐员担心代码。精良的步伐员担心数据结构及其关系——Linus Torvalds
这黑白常真实的。这就是为什么每个雇主在口试时都盼望候选人对数据结构有充实的相识。这也实用于 Android 开辟职员。
在这篇文章中,我们将先容全部 Android 开辟职员在破解口试和知识时必须具备的全部数据结构。固然尚有很多东西要学习,但我们将先容 Android 口试中最常用和最常见的题目。
什么是数据结构?

数据结构是一种数据构造、管理和存储格式,可实现高效访问和修改。
更精确地说,数据结构是数据值、它们之间的关系以及可应用于数据的功能或操纵的聚集。
比方,我们有一些数据,人名“ABC”和年岁25。这里“ABC”是字符串数据范例,25 是整数数据范例。
我们可以将此数据构造为像用户记载一样的记载,此中将包罗用户的姓名和年岁。如今我们可以将用户的记载作为数据结构网络并存储在文件或数据库中。
如今,让我们看看 Android 中最常用和最常被问到的数据结构。
你在准备口试吗?
Android 中最常用和扣问最多的数据结构


  • 数组
  • 链表
  • 哈希表

  • 队列

  • 图形
让我们一一具体研究全部这些数据结构。
数组

数组是用于存储同类数据的最常用和最简单的数据结构。数组是存储在连续内存位置的相似项的聚集。
比方,假如您要存储 10 个门生的分数,那么您可以通过为每个门生创建 10 个整数变量来做到这一点,而且您可以将分数存储在这些变量中。但是您必须在这里管理 10 个差别的变量,这是一项非常困难的任务,因为假如将来您必须存储 1000 王谢生的分数,那么假如您依照这种方法,则必须创建 1000 个变量。
因此,我们可以为此目标使用数组。您必要做的只是创建一个名为“marks”的数组,巨细为 10 或 1000 或其他任何值,然后将标记存储在该数组中。
注意:在险些全部编程语言中,我们都使用基于 0 的索引,即数组的索引将从 0 开始,不绝到 n-1,此中“n”是数组的巨细。
您可以借助其索引访问数组的元素:
marks[0] // to access the 1st element i.e. element at index 0marks[2] // to access the 3rd element i.e. element at index 2marks[4] // to access the 5th element i.e. element at index 4数组的一些根本操纵:

  • 插入:在数组的特定索引处插入给定元素
  • 删除:从数组中删除给定元素
  • 搜刮:在数组中搜刮特定元素
  • 更新:在特定索引处更新数组的元素
  • 遍历:打印或遍历整个数组
与数组相干的几个题目要尝试:

  • 数组中的最大值和最小值
  • 反转数组
  • 数组中的最小绝对差
链表

链表险些类似于数组,即它也是一种线性数据结构,用于存储相同范例的数据。这里,数据不是以连续方式存储的。链表中存储的数据是以节点的形式存储的,每个节点都可以通过一些指针或对下一个节点的引用毗连到另一个节点。
因此,链表中的节点有两部分,即数据部分和指针或引用部分。数据部分存储节点的数据,而指针或引用部分存储下一个节点的所在假如有)。
上图是单链表的一个例子,即这里我们只有下一个节点的所在。尚有一个称为“双向链表”的链表,此中前一个节点和下一个节点的所在由任何节点生存。除了这两种范例的链表,我们尚有一个“循环链表”。
在上图中,“Head”指向链表的第一个节点,链表的末了一个节点指向“Null”,即在该节点之后没有节点。
链表的一些根本操纵:

  • 插入:在这里,您必须将节点插入到链表中。您必须在链表的末了或链表的开头或链表之间的任何位置插入节点。
  • 删除:在删除操纵中,您必须从前面删除节点,即您必须删除头节点,或者您必须从链表中删除任何节点。
  • 搜刮:您将得到一个元素,您必须在链接列表中搜刮该元素。
  • 遍历:遍历整个链表,得到链表的每一个元素。
与链接列表相干的几个题目要尝试:

  • 将链表从位置 m 反转到 n
  • 检测和删除链表中的循环
  • 从链表末了删除第 n 个节点
  • 从排序列表中删除重复项
哈希表

哈希表是一种数据结构,用于以“键值”对的形式存储数据。您将拥有一些值或数据,并基于该数据天生一个键,并在该键的资助下将值存储在哈希表中。假如输入是匀称分布的,那么哈希表将在 O(1) 时间内实行插入、删除和搜刮操纵。
天生密钥并基于该密钥存储数据的过程称为“哈希”。要从数据中天生密钥,我们必要一个称为“哈希函数”的函数。哈希函数将数据作为输入,并将密钥作为输出。
比方,假如要存储的数据是:1、2、3、4、5、26、17,使用的哈希函数是:
hashFunction(k): k % 10而且数据将通过以下方式存储在哈希表中:
使用 Hash Table 时要思量的几点:

  • 哈希函数应该使得天生的键是匀称分布的。
  • 哈希表的巨细取决于哈希函数。以是,哈希函数的选择应该做到完满。
  • 在哈希表中发生辩说的情况下,应用恰当的辩说处理技能。
与哈希表相干的几个题目可以尝试:

  • 最长连续序列
  • 有效的字谜
  • 总和为 0 的最大子数组
  • 字符串中的第一个唯一字符


堆栈是使用后进先出序次(LIFO)的线性数据结构,即末了插入的元素将起首弹出。比方,假如您将一本书放在其他书上并继承此过程 50 本书,那么将起首获取最上面的书。在这里,您可以注意到最上面的书是放在末了或近来放置的书。
在 Stack 中,我们有一个“Top”变量表现堆栈的顶部。这是必要的,因为堆栈的全部操纵都是在“Top”变量的资助下完成的。
以下是堆栈的示例:
假如要从上面的 Stack 中删除元素,那么会先删除 5,然后再删除 4、3、2、1。
Stack上的一些根本操纵:

  • Push(): Push 用于在栈顶插入一个元素。
  • Pop(): Pop用于从栈顶删除一个元素。
  • Top:顶部用于表现堆栈的顶部元素。
与 Stack 相干的几个题目可以尝试:

  • 查抄表达式中的均衡括号
  • 使用递归反转堆栈
  • 使用堆栈实现队列
  • 使用另一个堆栈对堆栈进行排序
队列

队列是使用先辈先出(FIFO)序次的线性数据结构,即队列中开始出现的元素将起首从队列中删除。比方,在列队订票时,先来的人会先订票,而新来订票的人必须站在队列的末了。
在队列中,我们有“前”和“后”。Front 用于指向队列的前面元素,而 Rear 用于指向队列的反面元素。
以下是队列的示例:
因此,假如要从上述队列中删除元素,则起首删除 1,然后删除 2、3、4 和 5。
同样,假如你想在上面的队列中插入一个元素,那么它将从 Rear 而不是Front插入。
Queue的一些根本操纵:

  • Enqueue(): Enqueue 用于在 Queue 的末了插入一个元素。
  • Dequeue(): Dequeue用于从Queue的最前面删除一个元素。
  • Front:用于表现Queue的最前面的元素。
  • Rear:用于表现Queue的Rear元素。
与队列相干的几个题目要尝试:

  • 使用堆栈实现队列
  • 反转队列的前 k 个元素
  • LRU缓存实现


树是一种非线性的分层数据结构,用于以节点的形式存储数据。在这里,我们有节点,全部节点都在它们之间绘制的边的资助下相互毗连。一个父节点可以没有子节点,也可以有一个子节点或多个子节点。但是子节点不能有多个父节点。
下面是一个简单的树示例:
一些与树相干的术语是:

  • 根:根是存在于树顶部的节点。一棵特定的树只能有一个根。
  • 父节点:全部至少有一个子节点的节点称为父节点。
  • Child:父节点下面的节点称为父节点的子节点。
  • 叶:具有零个子节点的节点称为叶节点。
一些范例的树是:

  • 一样平常树
  • 二叉树
  • 二叉搜刮树
  • AVL 树
  • 红黑树
  • N叉树
与树相干的几个题目要尝试:

  • 在二叉树上查找高度
  • 二叉树中全部节点间隔K
  • BST 中的第 K 个最大元素
  • 归并两个 BST
图形

图形类似于树,即它也是一种非线性数据结构,以节点的形式存储数据,而且全部节点在边的资助下相互毗连。树和图之间的区别在于,图中有一个循环,但在树的情况下没有如许的循环。
图由一组有限的节点和一组负责毗连节点的有限边构成。
下面是一个图表的例子:
7.png 以下是图表的范例:

  • 有向图:这里的边将指向某个节点,即您将有一个箭头从一个节点指向一个节点。
  • 无向图:节点之间没有箭头。上面的例子是一个无向图的例子。
一些常见的图遍历技能有:

  • 深度优先搜刮(DFS)
  • 广度优先搜刮(BFS)
与 Graph 相干的几个题目要尝试:

  • 字梯题目
  • 棋盘上的骑士
  • 岛屿数量
  • 根据给定的约束查抄数组中的循环
末了

果想要成为架构师或想突破20~30K薪资范畴,那就不要范围在编码,业务,要会选型、扩展,提升编程思维。别的,精良的职业规划也很重要,学习的习惯很重要,但是最重要的照旧要能持之以恒,任何不能对峙落实的筹划都是空谈。
假如你没有方向,这里给各人分享一套由阿里高级架构师编写的《Android八大模块进阶条记》,帮各人将紊乱、零星、碎片化的知识进行体系化的整理,让各人体系而高效地把握Android开辟的各个知识点。帮各人将紊乱、零星、碎片化的知识进行体系化的整理,让各人体系而高效地把握Android开辟的各个知识点。
Android八大模块进阶学习资料

一、架构师筑基语言根本

知识要点:深入明白Java泛型、注解深入浅出、并发编程、数据传输与序列化、Java假造机原理、高效IO
二、Android高级UI开源框架进阶解密

知识要点:SmartTable使用指南、TextSurface源码分析、FloatWindow源码分析、RippleEffect使用指南等等
三、Android Framework 开辟揭秘

知识要点:体系启动流程分析、Binder分析、Handler分析、AMS 分析、WMS分析、Android10.0 源码解读
四、Android性能优化—实战分析

性能优化也是企业观察一个高级 Android 工程师技能程度的重要维度。特别是诸多大厂在这方面尤为看重,究竟就算0.1%的瑕疵,影响的将是百万级、万万级的用户体验!
11.png 五、音视频精编源码分析

知识要点:WebRTC Native 源码导读、X264源码解读、FFmpeg、ijkplayer 源码分析系列、jsmpeg源码分析、Live555源码分析、Opus源码分析
六、Flutter学习进阶

知识要点:Flutter跨平台开辟概述、Windows中Flutter开辟情况搭建、编写你的第一个Flutter APP、Flutter Dart语言体系入门等等
13.png 七、微信小步伐开辟

知识要点:小步伐概述及入门 、小步伐UI开辟、API操纵、购物阛阓项目实战
八、百大框架源码解读

知识要点:微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等
全套视频资料:

一、口试合集

二、源码分析合集

17.png 三、开源框架合集

篇幅有限,必要Android中高级口试合集,Android开辟学习资料的小同伴可以在点击这里免费领取,包管免费分享!
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-19 04:24, Processed in 0.184653 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表