风萧萧兮易水寒,壮士一去兮怎么还?
卑微小刘在线征婚?啊,呸。说错了,卑微小刘在线求面试资料啊!
不知道,大家有没有过这样的经历,这个故事还要从很久很久以前讲起,从前有一个美丽的小村庄…
画风不对,重新来。
是这样的,今年不是特殊情况吗?大家都知道哈!这里我就不过多的提及了,身边无数朋友来我这里抱怨。其中就有一个我的死党,给我打了电话!
正文我们今天将说明以下 14 种模式:
1.滑动窗口
2.二指针或迭代器
3.快速和慢速指针或迭代器
4.合并区间
5.循环排序
6.原地反转链表
7.树的宽度优先搜索(Tree BFS)
8.树的深度优先搜索(Tree DFS)
9.Two Heaps
10.子集
11.经过修改的二叉搜索
12. 前 K 个元素
13. K 路合并
14.拓扑排序
我们开始吧!
1.滑动窗口
滑动窗口模式是用于在给定数组或链表的特定窗口大小上执行所需的 *** 作,比如寻找包含所有 1 的最长子数组。从第一个元素开始滑动窗口并逐个元素地向右滑,并根据你所求解的问题调整窗口的长度。在某些情况下窗口大小会保持恒定,在其它情况下窗口大小会增大或减小。
下面是一些你可以用来确定给定问题可能需要滑动窗口的方法:
问题的输入是一种线性数据结构,比如链表、数组或字符串你被要求查找最长/最短的子字符串、子数组或所需的值你可以使用滑动窗口模式处理的常见问题:
大小为 K 的子数组的最大和(简单)带有 K 个不同字符的最长子字符串(中等)寻找字符相同但排序不一样的字符串(困难)2.二指针或迭代器
二指针(Two Pointers)是这样一种模式:两个指针以一前一后的模式在数据结构中迭代,直到一个或两个指针达到某种特定条件。二指针通常在排序数组或链表中搜索配对时很有用;比如当你必须将一个数组的每个元素与其它元素做比较时。
二指针是很有用的,因为如果只有一个指针,你必须继续在数组中循环回来才能找到答案。这种使用单个迭代器进行来回在时间和空间复杂度上都很低效——这个概念被称为「渐进分析(asymptotic analysis)」。尽管使用 1 个指针进行暴力搜索或简单普通的解决方案也有效果,但这会沿 O(n²) 线得到一些东西。在很多情况中,二指针有助于你寻找有更好空间或运行时间复杂度的解决方案。
用于识别使用二指针的时机的方法:
可用于你要处理排序数组(或链接列表)并需要查找满足某些约束的一组元素的问题数组中的元素集是配对、三元组甚至子数组下面是一些满足二指针模式的问题:
求一个排序数组的平方(简单)求总和为零的三元组(中等)比较包含回退(backspace)的字符串(中等)3.快速和慢速指针
快速和慢速指针方法也被称为 Hare & Tortoise 算法,该算法会使用两个在数组(或序列/链表)中以不同速度移动的指针。该方法在处理循环链表或数组时非常有用。
通过以不同的速度进行移动(比如在一个循环链表中),该算法证明这两个指针注定会相遇。只要这两个指针在同一个循环中,快速指针就会追赶上慢速指针。
如何判别使用快速和慢速模式的时机?
处理链表或数组中的循环的问题当你需要知道特定元素的位置或链表的总长度时何时应该优先选择这种方法,而不是上面提到的二指针方法?
有些情况不适合使用二指针方法,比如在不能反向移动的单链接链表中。使用快速和慢速模式的一个案例是当你想要确定一个链表是否为回文(palindrome)时。下面是一些满足快速和慢速指针模式的问题:
链表循环(简单)回文链表(中等)环形数组中的循环(困难)4.合并区间
合并区间模式是一种处理重叠区间的有效技术。在很多涉及区间的问题中,你既需要找到重叠的区间,也需要在这些区间重叠时合并它们。该模式的工作方式为:
给定两个区间(a 和 b),这两个区间有 6 种不同的互相关联的方式:
理解并识别这六种情况有助于你求解范围广泛的问题,从插入区间到优化区间合并等。
那么如何确定何时该使用合并区间模式呢?
如果你被要求得到一个仅含互斥区间的列表如果你听到了术语「重叠区间(overlapPing intervals)」合并区间模式的问题:
区间交叉(中等)最大 cpu 负载(困难)5. 循环排序
这一模式描述了一种有趣的方法,处理的是涉及包含给定范围内数值的数组的问题。循环排序模式一次会在数组上迭代一个数值,如果所迭代的当前数值不在正确的索引处,就将其与其正确索引处的数值交换。你可以尝试替换其正确索引处的数值,但这会带来 O(n^2) 的复杂度,这不是最优的,因此要用循环排序模式。
如何识别这种模式?
涉及数值在给定范围内的排序数组的问题如果问题要求你在一个排序/旋转的数组中找到缺失值/重复值/最小值循环排序模式的问题:
找到缺失值(简单)找到最小的缺失的正数值(中等)6.原地反转链表
在很多问题中,你可能会被要求反转一个链表中一组节点之间的链接。通常而言,你需要原地完成这一任务,即使用已有的节点对象且不占用额外的内存。这就是这个模式的用武之地。该模式会从一个指向链表头的变量(current)开始一次反转一个节点,然后一个变量(prevIoUs)将指向已经处理过的前一个节点。以锁步的方式,在移动到下一个节点之前将其指向前一个节点,可实现对当前节点的反转。另外,也将更新变量「prevIoUs」,使其总是指向已经处理过的前一个节点。
要如何成为AndroID架构师?搭建自己的知识框架,全面提升自己的技术体系,并且往底层源码方向深入钻研。@H_404_214@ 大多数技术人喜欢用思维脑图来构建自己的知识体系,一目了然。这里给大家分享一份大厂主流的AndroID架构师技术体系,可以用来搭建自己的知识框架,或者查漏补缺;@H_404_214@
对应这份技术大纲,我也整理了一套AndroID高级架构师完整系列的视频教程,主要针对3-5年AndroID开发经验以上,需要往高级架构师层次学习提升的同学,点击这里腾讯文档免费分享,希望能帮你突破瓶颈,跳槽进大厂;
最后我必须强调几点:
1.搭建知识框架可不是说你整理好要学习的知识顺序,然后看一遍理解了能复制粘贴就够了,大多都是需要你自己读懂源码和原理,能自己手写出来的。@H_404_214@ 2.学习的时候你一定要多看多练几遍,把知识才吃透,还要记笔记,这些很重要! 最后你达到什么水平取决你消化了多少知识@H_404_214@ 3.最终你的知识框架应该是一个完善的,兼顾广度和深度的技术体系。然后经过多次项目实战积累经验,你才能达到高级架构师的层次。
你只需要按照在这个大的框架去填充自己,年薪40W一定不是终点,技术无止境
.学习的时候你一定要多看多练几遍,把知识才吃透,还要记笔记,这些很重要! 最后你达到什么水平取决你消化了多少知识@H_404_214@ 3.最终你的知识框架应该是一个完善的,兼顾广度和深度的技术体系。然后经过多次项目实战积累经验,你才能达到高级架构师的层次。
你只需要按照在这个大的框架去填充自己,年薪40W一定不是终点,技术无止境
总结以上是内存溢出为你收集整理的2021最新中高阶Android面试题总结,已整理成文档全部内容,希望文章能够帮你解决2021最新中高阶Android面试题总结,已整理成文档所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)