android内存优化面试题,如何成为一个更好的Android开发者

2023-10-29

前言

事情是这样的,今年年初,在某个大博主那里拿到一份Android面试宝典合集,然后就一直躺在盘里吃灰,直到5月份的时候,有了要跳槽的计划和打算,就想着要刷刷面试题,所以就把这套“积灰”的面试宝典拿出看了看,因为这份文档是一位Alibaba资深架构师给我的,文档多达938页,这一看就看了一个多月才算是完整的吃透。吃透之后更是对自己信心满满。接着7月中旬开始面试,一口气 投了差不多十份简历,一直不停的面试,之后没让自己失望,接受收到了滴滴,美团,腾讯等 offer,接下来我们就一起来学习这份多达938页的面试合集吧!

由于文档内容过多,篇幅有限,不能完全展现,只能以截图方式展示,需要完整pdf版,可以在文末免费领取。

正文

我们今天将说明以下 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 的最长子数组。从第一个元素开始滑动窗口并逐个元素地向右滑,并根据你所求解的问题调整窗口的长度。在某些情况下窗口大小会保持恒定,在其它情况下窗口大小会增大或减小。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Pgfcc0x-1648367585699)(https://upload-images.jianshu.io/upload_images/24826283-9e91343676462abf?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

下面是一些你可以用来确定给定问题可能需要滑动窗口的方法:

  • 问题的输入是一种线性数据结构,比如链表、数组或字符串
  • 你被要求查找最长/最短的子字符串、子数组或所需的值

你可以使用滑动窗口模式处理的常见问题:

  • 大小为 K 的子数组的最大和(简单)
  • 带有 K 个不同字符的最长子字符串(中等)
  • 寻找字符相同但排序不一样的字符串(困难)

2.二指针或迭代器

二指针(Two Pointers)是这样一种模式:两个指针以一前一后的模式在数据结构中迭代,直到一个或两个指针达到某种特定条件。二指针通常在排序数组或链表中搜索配对时很有用;比如当你必须将一个数组的每个元素与其它元素做比较时。

二指针是很有用的,因为如果只有一个指针,你必须继续在数组中循环回来才能找到答案。这种使用单个迭代器进行来回在时间和空间复杂度上都很低效——这个概念被称为「渐进分析(asymptotic analysis)」。尽管使用 1 个指针进行暴力搜索或简单普通的解决方案也有效果,但这会沿 O(n²) 线得到一些东西。在很多情况中,二指针有助于你寻找有更好空间或运行时间复杂度的解决方案。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iclSqt2n-1648367585700)(https://upload-images.jianshu.io/upload_images/24826283-53083806b4092779?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

用于识别使用二指针的时机的方法:

  • 可用于你要处理排序数组(或链接列表)并需要查找满足某些约束的一组元素的问题
  • 数组中的元素集是配对、三元组甚至子数组

下面是一些满足二指针模式的问题:

  • 求一个排序数组的平方(简单)
  • 求总和为零的三元组(中等)
  • 比较包含回退(backspace)的字符串(中等)

3.快速和慢速指针

快速和慢速指针方法也被称为 Hare & Tortoise 算法,该算法会使用两个在数组(或序列/链表)中以不同速度移动的指针。该方法在处理循环链表或数组时非常有用。

通过以不同的速度进行移动(比如在一个循环链表中),该算法证明这两个指针注定会相遇。只要这两个指针在同一个循环中,快速指针就会追赶上慢速指针。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xGVAHc15-1648367585700)(https://upload-images.jianshu.io/upload_images/24826283-93877d3646a8d5e9?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

如何判别使用快速和慢速模式的时机?

  • 处理链表或数组中的循环的问题
  • 当你需要知道特定元素的位置或链表的总长度时

何时应该优先选择这种方法,而不是上面提到的二指针方法?

  • 有些情况不适合使用二指针方法,比如在不能反向移动的单链接链表中。使用快速和慢速模式的一个案例是当你想要确定一个链表是否为回文(palindrome)时。

下面是一些满足快速和慢速指针模式的问题:

  • 链表循环(简单)
  • 回文链表(中等)
  • 环形数组中的循环(困难)

4.合并区间

合并区间模式是一种处理重叠区间的有效技术。在很多涉及区间的问题中,你既需要找到重叠的区间,也需要在这些区间重叠时合并它们。该模式的工作方式为:

给定两个区间(a 和 b),这两个区间有 6 种不同的互相关联的方式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6ib9NVon-1648367585701)(https://upload-images.jianshu.io/upload_images/24826283-8bc080b69b8067a7?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

理解并识别这六种情况有助于你求解范围广泛的问题,从插入区间到优化区间合并等。

那么如何确定何时该使用合并区间模式呢?

  • 如果你被要求得到一个仅含互斥区间的列表
  • 如果你听到了术语「重叠区间(overlapping intervals)」

合并区间模式的问题:

  • 区间交叉(中等)
  • 最大 CPU 负载(困难)

5. 循环排序

这一模式描述了一种有趣的方法,处理的是涉及包含给定范围内数值的数组的问题。循环排序模式一次会在数组上迭代一个数值,如果所迭代的当前数值不在正确的索引处,就将其与其正确索引处的数值交换。你可以尝试替换其正确索引处的数值,但这会带来 O(n^2) 的复杂度,这不是最优的,因此要用循环排序模式。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xXubyonk-1648367585701)(https://upload-images.jianshu.io/upload_images/24826283-cee5a39809f53778?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

如何识别这种模式?

  • 涉及数值在给定范围内的排序数组的问题
  • 如果问题要求你在一个排序/旋转的数组中找到缺失值/重复值/最小值

循环排序模式的问题:

  • 找到缺失值(简单)
  • 找到最小的缺失的正数值(中等)

6.原地反转链表

在很多问题中,你可能会被要求反转一个链表中一组节点之间的链接。通常而言,你需要原地完成这一任务,即使用已有的节点对象且不占用额外的内存。这就是这个模式的用武之地。该模式会从一个指向链表头的变量(current)开始一次反转一个节点,然后一个变量(previous)将指向已经处理过的前一个节点。以锁步的方式,在移动到下一个节点之前将其指向前一个节点,可实现对当前节点的反转。另外,也将更新变量「previous」,使其总是指向已经处理过的前一个节点。

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

优秀开源项目:

  • ali1024.coding.net/public/P7/Android/git

  • github.com/android

最后,面试前该准备哪些资源复习?

其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

这里再分享一下我面试期间的复习路线:(以下体系的复习资料是我从各路大佬收集整理好的)

《Android开发七大模块核心知识笔记》

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PXF7WBc7-1648367585702)(https://upload-images.jianshu.io/upload_images/24826283-dd06860c19059590?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fIcXMxmD-1648367585702)(https://upload-images.jianshu.io/upload_images/24826283-137362cbeb26c410?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

《960全网最全Android开发笔记》

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IcwIdZHy-1648367585703)(https://upload-images.jianshu.io/upload_images/24826283-b3377abe1fd80724?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

《379页Android开发面试宝典》

历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
大大增加通过前两轮技术面试的几率。

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android内存优化面试题,如何成为一个更好的Android开发者 的相关文章

  • 如何为ScrollView放置固定图像背景?

    我应该想要滚动视图滚动 而不是背景中的图像 将图像添加到滚动视图框架之前的视图层次结构的较高位置
  • Sqlite数据库生命周期?关闭应用程序后它会被删除吗?

    我正在遵循一个简单的教程 该教程创建一个从 SQLiteOpenHelper 扩展的类 并创建一个包含一个表和 5 行的数据库 好的 但我需要更多地了解 android Sqlite 数据库 例如 如果应用程序关闭或手机关机会发生什么 数据
  • Android - 从资产中解析巨大(超大)JSON 文件的最佳方法

    我正在尝试从资产文件夹中解析一些巨大的 JSON 文件 我如何加载并添加到 RecyclerView 我想知道解析这种大文件 大约 6MB 的最佳方法是什么 以及您是否知道可以帮助我处理此文件的良好 API 我建议您使用GSON lib h
  • 无法获取log.d或输出Robolectrict + gradle

    有没有人能够将 System out 或 Log d 跟踪从 robolectric 测试输出到 gradle 控制台 我在用Robolectric Gradle 测试插件 https github com robolectric robo
  • 是否可以将数组或对象添加到 Android 上的 SharedPreferences

    我有一个ArrayList具有名称和图标指针的对象 我想将其保存在SharedPreferences 我能怎么做 注意 我不想使用数据库 无论 API 级别如何 请检查SharedPreferences 中的字符串数组和对象数组 http
  • 当文本输入聚焦在 React Native for Android 的底部工作表上时,视图移出屏幕

    我正在使用图书馆 https github com osdnk react native reanimated bottom sheet https github com osdnk react native reanimated bott
  • 是否有 ADB 命令来检查媒体是否正在播放

    我想使用 ADB 命令检查根植于终端的外部设备中是否正在播放音频 视频 我无法找到任何 ADB 命令 如果有 我尝试过 adb shell dumpsys media player 我想要一个命令来指定视频是否正在运行 您可以使用以下命令查
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 在gradle插件中获取应用程序变体的包名称

    我正在构建一个 gradle 插件 为每个应用程序变体添加一个新任务 此新任务需要应用程序变体的包名称 这是我当前的代码 它停止使用最新版本的 android gradle 插件 private String getPackageName
  • 如何使用InputConnectionWrapper?

    我有一个EditText 现在我想获取用户对此所做的所有更改EditText并在手动将它们插入之前使用它们EditText 我不希望用户直接更改中的文本EditText 这只能由我的代码完成 例如通过使用replace or setText
  • 如何默认在 ActionOpenDocument 意图中显示“内部存储”选项

    我需要用户选择一个自定义文件类型的文件 并将其从 Windows 文件资源管理器拖到 Android 设备上 但默认情况下内部存储选项不可用 当我使用以下命令启动意图时 var libraryIntent new Intent Intent
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 错误:在根项目“projectName”中找不到项目“app”

    我有一个在 Eclipse 中开发的旧应用程序 现在尝试将其迁移到 Android Studio 我更新了库并遵循了基本步骤 现在 我收到此错误 Error Project app not found in root project pro
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这
  • 我的设备突然没有显示在“Android 设备选择器”中

    我正在使用我的三星 Galaxy3 设备来测试过去两个月的应用程序 它运行良好 但从今天早上开始 当我将设备连接到系统时 它突然没有显示在 Android 设备选择器 窗口中 我检查过 USB 调试模式仅在我的设备中处于选中状态 谁能猜出问
  • 在activity_main.xml中注释

    我是安卓新手 据我所知 XML 中的注释与 HTML 中的注释相同 使用 形式 我想在 Android 项目的 Activity main xml 配置文件中写一些注释 但它给了我错误 值得注意的是 我使用的是 Eclipse 但目前 我直
  • 将 Intent 包装在 LabeledIntent 中以用于显示目的

    要求 我的应用程序中有一个 共享 按钮 我需要通过 Facebook 分享 我需要选择是否安装原生 Facebook 应用程序 我们的决定是 如果未安装该应用程序 则将用户发送到 facebook com 进行分享 当前状态 我可以检测何时
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • Crashlytics 出现 Android Studio 构建错误

    我正在尝试将 CrashLytics 与 Android Studio 和 gradle 一起使用 但出现一个令人困惑的错误 java lang NoSuchMethodError 我的 build gradle 是 buildscript

随机推荐

  • 关于RocketMq消息积压问题排查

    1 最近生产的mq出现了一个问题 我的消费者是集群 就是双节点 现在消息积压到1亿多条 如下图所示 其中有两个问题 问题1 就是为什么我的消息积压这么多 问题2 我的消费者是集群 为什么只有一台消息在消费 2 接着开始排查问题 结果发现在消
  • conda进行transformers安装

    首先建立新环境 conda create n myenv python 3 8 安装numpy和pytorch conda install numpy conda install pytorch torchvision torchaudio
  • 人脸检测 + 数据训练 + 人脸识别

    准备工作 安装opencv pip install opencv 安装opencv contrib pip install opencv contrib 创建文件夹 文件结构为 一 编写一个基础的人脸识别 import cv2 as cv
  • 服务器存档里怎么修改器,云服务器存档修改器

    云服务器存档修改器 内容精选 换一换 修改云服务器信息 目前支持修改云服务器名称及描述和hostname 该接口支持企业项目细粒度权限的校验 具体细粒度请参见 ecs cloudServers put云服务器hostname修改后 需要重启
  • 面试官常问到的问题

    dom是什么 虚拟DOM又是什么 有何作用 谈谈你对vue的理解以及2和3的区别 双向数据绑定 数据类型有哪些 深拷贝和浅拷贝是什么 它们的区别是什么 组建通信了解吗 重绘和回流是什么 一般开发用什么布局 VUEX了解吗 说说它的五大属性及
  • react-native 屏幕尺寸和文字大小适配

    转载存档 现在的手机品牌和型号越来越多 导致我们平时写布局的时候会在个不同的移动设备上显示的效果不同 比如我们的设计稿一个View的大小是300px 如果直接写300px 可能在当前设备显示正常 但到了其他设备可能就会偏小或者偏大 这就需要
  • yum私有仓库的实现

    目录 一 yum私有仓库的实现 二 画图 TCP协议和三次握手及四次挥手 三 centos ubuntu 静态网卡IP配置 四 实现免密登录脚本 expect登录远程主机 将生成的密钥写入到目标主机 expect测试远程登录 一 yum私有
  • GB2312编码理解

    计算机信息交换使用汉字编码字符集是国家1980年发布 标准号为 GB2312 1980 GB2312编码主要适用于汉字处理 汉字通讯等系统之间的信息交换 基本集主要收集了6763个汉字和682个图形字符 整个字符集分成94个区 每个区有94
  • 坐标变换(1)—向量和坐标系

    1 标量 在介绍向量之前 有必要介绍一下标量 scalar 标量是一个数字 只有大小 没有方向 不过有正负 例如温度 重量等 2 向量 向量 vector 是多个数字组成的列表 n n n个有次序的数 x 1
  • [授权发表]Shell编程范例之文件操作

    by falcon 最初发表 泰晓科技 聚焦嵌入式 Linux 追本溯源 见微知著 原文链接 Shell编程范例之文件操作 评论说明 为更好地聚合大家的讨论 请到上面原文的评论区回复 前言 这一周我们来探讨文件操作 在日常学习和工作中 我们
  • 计算机网络笔记四(应用层:DNS协议、FTP协议)

    1 DNS协议 1 1DNS协议基本概念 1 1 1什么是域名 域名 英语 Domain Name 又称网域 是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称 用于在数据传输时对计算机的定位标识 有时也指地理位置
  • 逻辑器件1

    1 COMS器件 常用的74LV 74AC 74AHC 74HC等系列都属于CMOS器件 输入端是上P下N MOS组成的电路 2 缺点是高低电平之间有一段非稳态区间 这个区间PMOS和NMOS部分导通 输出会有振荡 3 逻辑器件 TTL C
  • Windows环境下pcl点云库 安装配置全流程(精简、有效)

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net zaibeijixing article details 130770476 本文为W
  • brk(), sbrk() 用法详解

    http blog csdn net ssjhust123 article details 7772153 brk sbrk 的声明如下 cpp view plain copy include
  • H无穷控制器在Matlab中的实现

    H无穷控制器在Matlab中的实现 H无穷控制器是一种广泛应用于控制系统设计中的方法 它可以用来设计具有鲁棒性和性能要求的控制器 在本文中 我们将介绍如何在Matlab中实现H无穷控制器 并提供相应的源代码 H无穷控制器的设计主要涉及到两个
  • python 用OpenCV统计图片中黄色部分的个数。

    原图片 我的想法是 先将图片中除了黄色的部分全部变为白色 然后再利用 cv2 findContours 函数来识别轮廓 直接统计轮廓的个数就是黄色部分的个数 程序代码 coding utf 8 import os import cv2 im
  • 2023mathorcupA题量子计算机在信用评分卡组合优化中的应用思路

    2023mathorcup A题 量子计算机在信用评分卡组合优化中的应用思路 gzh数模孵化园 出品 先说说这题难在哪 主要在于计算 计算 还是计算 优化算法的计算 三道题都是考察这个 而且是转变为QUBO 形式并求解 问题1要求在100个
  • angular蚂蚁_angular api文档

    AngularJS 中的友好 URL 移除URL 中的 已翻译100 AngularJS 默认将会使用一个 号来对URL进行路由 例如 http example com http example com about http example
  • vue+element ui中的tableData中的数据格式

    tableData接收的是一个数组 数组中的元素是一个个的键值对 如图 tableData接收从后端返回的值 遍历一维数组 就是说 tabelData member 那么从纵向而言 就是遍历数组的个数 tableData从member中 取
  • android内存优化面试题,如何成为一个更好的Android开发者

    前言 事情是这样的 今年年初 在某个大博主那里拿到一份Android面试宝典合集 然后就一直躺在盘里吃灰 直到5月份的时候 有了要跳槽的计划和打算 就想着要刷刷面试题 所以就把这套 积灰 的面试宝典拿出看了看 因为这份文档是一位Alibab