ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021Android开发现状分析,人生转折!

2021-07-07 21:02:14  阅读:148  来源: 互联网

标签:https 现状 2021Android 模式 链表 面试 数组 转折 指针


### 正文 我们今天将说明以下 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 的最长子数组。从第一个元素开始滑动窗口并逐个元素地向右滑,并根据你所求解的问题调整窗口的长度。在某些情况下窗口大小会保持恒定,在其它情况下窗口大小会增大或减小。 ![准备程序员面试?你需要了解这 14 种编程面试模式](http://www.icode9.com/i/li/?n=2&i=images/20210707/1625662354680184.jpg) 下面是一些你可以用来确定给定问题可能需要滑动窗口的方法: * 问题的输入是一种线性数据结构,比如链表、数组或字符串 * 你被要求查找最长/最短的子字符串、子数组或所需的值 你可以使用滑动窗口模式处理的常见问题: * 大小为 K 的子数组的最大和(简单) * 带有 K 个不同字符的最长子字符串(中等) * 寻找字符相同但排序不一样的字符串(困难) **2.二指针或迭代器** 二指针(Two Pointers)是这样一种模式:两个指针以一前一后的模式在数据结构中迭代,直到一个或两个指针达到某种特定条件。二指针通常在排序数组或链表中搜索配对时很有用;比如当你必须将一个数组的每个元素与其它元素做比较时。 二指针是很有用的,因为如果只有一个指针,你必须继续在数组中循环回来才能找到答案。这种使用单个迭代器进行来回在时间和空间复杂度上都很低效——这个概念被称为「渐进分析(asymptotic analysis)」。尽管使用 1 个指针进行暴力搜索或简单普通的解决方案也有效果,但这会沿 O(n2) 线得到一些东西。在很多情况中,二指针有助于你寻找有更好空间或运行时间复杂度的解决方案。 ![准备程序员面试?你需要了解这 14 种编程面试模式](http://www.icode9.com/i/li/?n=2&i=images/20210707/1625662354778470.jpg) 用于识别使用二指针的时机的方法: * 可用于你要处理排序数组(或链接列表)并需要查找满足某些约束的一组元素的问题 * 数组中的元素集是配对、三元组甚至子数组 下面是一些满足二指针模式的问题: * 求一个排序数组的平方(简单) * 求总和为零的三元组(中等) * 比较包含回退(backspace)的字符串(中等) **3.快速和慢速指针** 快速和慢速指针方法也被称为 Hare & Tortoise 算法,该算法会使用两个在数组(或序列/链表)中以不同速度移动的指针。该方法在处理循环链表或数组时非常有用。 通过以不同的速度进行移动(比如在一个循环链表中),该算法证明这两个指针注定会相遇。只要这两个指针在同一个循环中,快速指针就会追赶上慢速指针。 ![准备程序员面试?你需要了解这 14 种编程面试模式](http://www.icode9.com/i/li/?n=2&i=images/20210707/1625662354946436.jpg) 如何判别使用快速和慢速模式的时机? * 处理链表或数组中的循环的问题 * 当你需要知道特定元素的位置或链表的总长度时 何时应该优先选择这种方法,而不是上面提到的二指针方法? * 有些情况不适合使用二指针方法,比如在不能反向移动的单链接链表中。使用快速和慢速模式的一个案例是当你想要确定一个链表是否为回文(palindrome)时。 下面是一些满足快速和慢速指针模式的问题: * 链表循环(简单) * 回文链表(中等) * 环形数组中的循环(困难) **4.合并区间** 合并区间模式是一种处理重叠区间的有效技术。在很多涉及区间的问题中,你既需要找到重叠的区间,也需要在这些区间重叠时合并它们。该模式的工作方式为: 给定两个区间(a 和 b),这两个区间有 6 种不同的互相关联的方式: ![准备程序员面试?你需要了解这 14 种编程面试模式](http://www.icode9.com/i/li/?n=2&i=images/20210707/1625662354589870.jpg) 理解并识别这六种情况有助于你求解范围广泛的问题,从插入区间到优化区间合并等。 那么如何确定何时该使用合并区间模式呢? * 如果你被要求得到一个仅含互斥区间的列表 * 如果你听到了术语「重叠区间(overlapping intervals)」 合并区间模式的问题: * 区间交叉(中等) * 最大 CPU 负载(困难) **5\. 循环排序** 这一模式描述了一种有趣的方法,处理的是涉及包含给定范围内数值的数组的问题。循环排序模式一次会在数组上迭代一个数值,如果所迭代的当前数值不在正确的索引处,就将其与其正确索引处的数值交换。你可以尝试替换其正确索引处的数值,但这会带来 O(n^2) 的复杂度,这不是最优的,因此要用循环排序模式。 ![准备程序员面试?你需要了解这 14 种编程面试模式](http://www.icode9.com/i/li/?n=2&i=images/20210707/1625662355748952.jpg) 如何识别这种模式? * 涉及数值在给定范围内的排序数组的问题 * 如果问题要求你在一个排序/旋转的数组中找到缺失值/重复值/最小值 循环排序模式的问题: * 找到缺失值(简单) * 找到最小的缺失的正数值(中等) **6.原地反转链表** 在很多问题中,你可能会被要求反转一个链表中一组节点之间的链接。通常而言,你需要原地完成这一任务,即使用已有的节点对象且不占用额外的内存。这就是这个模式的用武之地。该模式会从一个指向链表头的变量(current)开始一次反转一个节点,然后一个变量(previous)将指向已经处理过的前一个节点。以锁步的方式,在移动到下一个节点之前将其指向前一个节点,可实现对当前节点的反转。另外,也将更新变量「previous」,使其总是指向已经处理过的前一个节点。 # 总结 Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。**所以:贵在坚持!** 上面分享的字节跳动公司2020年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。详情可以点击我的[【Github】](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md) 如果你熟练掌握[【Github】](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)中列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。 **就先写到这,码字不易,写的很片面不好之处敬请指出,如果觉得有参考价值的朋友也可以关注一下我** > **①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包——————可以我的【Github】阅读下载**,最后觉得有帮助、有需要的朋友可以点个赞 > > ![](http://www.icode9.com/i/li/?n=2&i=images/20210707/1625662355861970.jpg) > > ![](http://www.icode9.com/i/li/?n=2&i=images/20210707/1625662355104812.jpg) > > ![](http://www.icode9.com/i/li/?n=2&i=images/20210707/1625662355243437.jpg)

标签:https,现状,2021Android,模式,链表,面试,数组,转折,指针
来源: https://blog.51cto.com/u_15285973/3006516

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有