自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(170)
  • 收藏
  • 关注

原创 Android 知识路线

Android 知识点核心知识点BinderAIDL多进程View 的绘制事件分发消息队列Activity 难点Service 难点ContentProvider 难点AsyncTask 原理RemoteViewsWindow 和 ViewRootImpl刁钻问题汇总其他补充开源库原理RetrofitRxjavaGlideGradleGroovyGrad...

2019-08-18 22:15:30 288

原创 [leetcode][1641]统计字典序元音字符串的数目

相当于 0

2023-03-29 20:20:56 298

原创 [leetcode][2319]判断矩阵是否是一个 X 矩阵

时间复杂度:O(n^2)空间复杂度:O(1)

2023-01-31 13:11:35 168

原创 [leetcode][2315]统计星号

使用 valid 标记是否处于竖线对。如果不在竖线对,字符是 *,答案加一。时间复杂度:O(n),一次遍历。空间复杂度:O(1),常数空间。

2023-01-29 23:20:20 176

原创 [leetcode][1664]生成平衡数组的方案数

使用 4 个 int 分别保存被删除位置左边和右边的奇数位和、偶数位和。时间复杂度:O(n),两次遍历。空间复杂度:O(1),常数空间。

2023-01-28 23:30:13 157 1

原创 [leetcode][2293]极大极小游戏

空间复杂度:O(n),每个新数组的长度是 n / 2 + n / 4 + …空间复杂度:O(n),每个新数组的长度是 n / 2 + n / 4 + …时间复杂度:O(n),每一轮需要 n / 2 + n / 4 + …时间复杂度:O(n),每一轮需要 n / 2 + n / 4 + …时间复杂度:O(n),每一轮需要 n / 2 + n / 4 + …空间复杂度:O(1),不需要额外空间。

2023-01-15 22:41:12 212

原创 [acwing][785]快速排序

找到中间位置的值 x,将所有 = x 的数字排到它后面。然后处理 [left, pos] 和 [pos, right]两个区间。时间复杂度:O(nlogn),找到每个元素的位置要 n 时间,递归深度 logn,平均 nlogn。空间复杂度:O(logn),递归深度 logn。如果 left >= right,递归结束。

2023-01-08 23:56:07 89

原创 [leetcode][2185]统计包含给定前缀的字符串

遍历每个字符串,判断是否以 pref 为前缀。使用 startsWith 判断。时间复杂度:O(mn),m 是 pref 的长度,n 是 words 的长度。空间复杂度:O(1),常数空间。

2023-01-08 23:24:33 85

原创 [leetcode][1802]有界数组中指定下标处的最大值

查找最大值用二分查找,范围的最小值为1,最大值为 maxSum。查找条件为区间和不超过 maxSum,相邻元素按照减 1 递减,直到为 1。查找左右两个区间和,使用 cal 方法,big - 1为等差数列的最后一个,按照 length 得到等差数列的第一个,或者存在多余的 1。分两种情况求和,(s1 + sn) * n / 2 + 额外存在的 1。时间复杂度:O(log(maxSum)),二分查找时间复杂度。空间复杂度:O(1),常数空间。

2023-01-04 23:58:37 72

原创 [leetcode][2042]检查句子中的数字是否递增

找到字符串中的每个数字,然后和前一个数字比较,如果不是严格递增就提前返回 false。否则返回 true。注意这题不要使用 split 方法,因为 java 的 split 耗时多。空间复杂度:O(1),需要 2 个整数变量。时间复杂度:O(n),遍历 n 个元素。

2023-01-03 23:55:39 92

原创 [leetcode][1801]积压订单中的订单总数

需要注意比较当前订单和队列头部的数量,选择两者较小的值,并且把剩余的数量分别放回买卖的两个队列。时间复杂度:O(nlogn),优先级队列,遍历n个元素,每个元素处理时间为logn。积压订单用优先队列表示,因为需要删除买的价格贵和卖的价格低的订单,因此用优先队列。采购订单按照买入的价格降序,优先删除贵的;销售订单按照升序,优先删除价格低的。空间复杂度:O(n),队列的大小为元素个数。

2023-01-02 22:33:36 74

原创 [leetcode][2351]第一个出现两次的字母

用 int 的 32 个 bit 记录每个字母是否出现过。空间复杂度:O(1),一个 int 表示。用 int[] 记录每个字母出现的次数。用 set 记录每个字母出现的次数。空间复杂度:O(26),字母个数。空间复杂度:O(26),字母个数。时间复杂度:O(n),遍历一次。时间复杂度:O(n),遍历一次。时间复杂度:O(n),遍历一次。

2023-01-01 23:57:48 75

原创 [leetcode][2037]使每位学生都有座位的最少移动次数

将位置和学生分别排序,然后对差的绝对值求和。交换位置不会得到更优的答案。可以交换后分情况讨论得出结论。综合所有情况,ans1

2022-12-31 22:58:21 408

原创 Kotlin的协程:flow

之前介绍的启动协程方法,比如 launch、async 都是协程的单次启动。如果有复杂场景,比如发送多个数据,就需要使用 flow 数据流。在 flow 中,数据如水流一样经过上游发送,中间站处理,下游接收。flow 是 kotlin 提供的解决复杂异步场景的方案。flow 由创建、中间操作符、终止操作符三个部分组成。flow 的生命周期可以分为 onStart 和 onComplete,与它们在 flow 的位置无关。flow 的异常处理使用 catch。catch 与位置相关。

2022-10-19 17:34:35 1235

原创 Android Jetpack Compose介绍

Jetpack Compose 是用于构建原生 Android 界面的新工具包。它使用更少的代码、强大的工具和直观的 Kotlin API,可以帮助您简化并加快 Android 界面开发。2019年5月,Google在I/O大会上公布Compose2020年9月,发布第一个Alpha版本2021年7月,发布第一个稳定版本参数指定默认值。函数参数很多时,可以分为必选参数和可选参数。命名参数可以不按照顺序传参。举例:文本控件只需要传入文字是什么。Text API定义2.2 高阶函数参数是函数的函数

2022-07-08 00:16:16 869

原创 Kotlin的协程:上下文

Kotlin 的协程上下文叫做 CoroutineContext,通常用来切换线程池。launch 的第一个参数 context 是 CoroutineContext,默认值是 EmptyCoroutineContext。如果需要指定 launch 工作的线程池,就需要指定 CoroutineContext 参数。withContextwithContext 用来切换线程执行代码。它的第一个参数是 CoroutineContext,指定线程池。在 getUserInfoIo 中指定 withConte

2022-06-30 19:09:13 1058

原创 Kotlin的协程:生命周期

Job使用 launch 函数启动协程后,launch 会返回 job 作为返回值。可以通过 job 监控协程的生命周期状态,并且控制协程的生命周期。job 的生命周期状态![协程 Job 生命周期.jpg](https://img-blog.csdnimg.cn/img_convert/8e5b895cc8fd0d15c6850c118b4960f5.png#clientId=u19026c21-d676-4&crop=0&crop=0&crop=1&crop=1&

2022-05-19 17:47:59 895

原创 Kotlin的协程:挂起函数

挂起函数挂起函数是指使用 suspend 关键字修饰的函数。suspend fun getUserInfo(): String { withContext(Dispatchers.IO) { delay(1000L) } return "BoyCoder"}挂起和恢复挂起函数与普通函数的区别在于:挂起函数可以挂起和恢复。挂起和恢复也是协程与线程相比的优势。考虑下面一种场景:获取用户信息获取用户的好友获取每位好友的动态如果使用 Java,可能会

2022-05-06 15:26:02 2975

原创 Kotlin协程:启动协程

Kotlin 启动协程有 3 种方式:launch、async 和 runBlocking。在使用协程之前需要引入协程库依赖。"org.jetbrains.kotlinx:kotlinx-coroutines-core:$versions.coroutines"在运行示例前,配置协程调试 VM 参数:Edit config -> VM options-Dkotlinx.coroutines.debuglaunchlaunch用来启动协程,但是不需要获取运行后的返回结果。它类似于”射箭

2022-05-01 00:01:08 2484

原创 Kotlin的泛型:协变与逆变

Kotlin 的协变与逆变统称为 Kotlin 的变型。变型是指泛型的基础类型与它的参数类型是如何关联的。对于普通类型来说,我们可以使用子类代替父类,因为子类包含了父类的全部内容。但是对于泛型来说,如果泛型的基础类型相同,其中一个参数类型是另外一个参数类型的子类,泛型类也不存在这种继承关系,无法直接替换使用。要解除这些限制,就需要用到协变与逆变。变型变型的存在是为了解决函数的泛型参数传递问题。下面的代码中,printContents 接收 List 的参数,然后把 list 中的每个元素拼接成 St

2022-03-13 01:25:06 945

原创 Kotlin的泛型:类型擦除与实化

JVM 的泛型一般是通过类型擦除实现的,就是说泛型的类型实参在运行时不保留。​和 Java 一样,Kotlin 的泛型在运行时也被擦除了,但是 Kotlin 可以通过将函数声明为 inline 来解决这个问题。Kotlin 可以声明一个 inline 函数,使用实化 reified 使其类型实参不被擦除。类型检查与转换在运行时,List 的类型实参 String 被擦除了,只能知道它是一个 List,不能知道它是否声明为一个字符串列表。​list1 和 list2 在运行时每个都是 List,不

2022-02-22 15:58:39 1477

原创 Kotlin的泛型:泛型类型参数

Kotlin 的泛型是指带类型形参的类型。当泛型的实例被创建时,类型形参被替换为具体类型。​以 Kotlin 的 list 方法为例,当创建一个字符串列表时,类型形参 T 被替换为具体类型 String。val strList: List<String>public inline fun <T> List(size: Int, init: (index: Int) -> T): List<T> = MutableList(size, init)除了 L

2022-02-15 17:36:48 4096

原创 Kotlin的委托机制

Kotlin 的委托机制在语言层面自动实现了 Java 的组合代理。Kotlin 的委托包括委托类、委托属性,使用 by 关键字表示委托。委托类假设有一个接口类 Db,用来保存数据。interface Db { fun save()}Db 有两个具体的实现类 SqlDb 和 GreenDaoDbclass SqlDb : Db { override fun save() { println("save sql db") }}class GreenD

2022-01-28 17:37:29 3563

原创 Android Jetpack 之使用 WorkManager

Android Jetpack 之使用 WorkManager简介WorkManager 是 Android Jetpack 的一部分,它主要用来执行持续的后台工作,比如文件上传、日志上传等。WorManager 可以执行一次性任务(One time),也可以执行周期性任务(Perodic)。WorkManager也可以按照执行时间分为 3 类:立即运行(Immediate)长期运行(Long Running)推迟运行(Deferrable)使用方法添加依赖dependencies

2022-01-12 19:29:22 2059

原创 Android Jetpack 之使用 livedata

Android Jetpack 之使用 livedataLiveData 类是 Android Jetpack 的重要组成部分。将数据封装为 LiveData 后,数据变为了可以感知组件生命周期的可观察数据类。LiveData 的优势确保界面符合数据状态使用观察者模式在数据源改变时自动更新界面。不会发生内存泄漏观察者会绑定到 Lifecycle 对象,在组件生命周期结束后自动清理 。不会因为 Activity 停止而导致崩溃如果观察者绑定的 Activity 处于非活跃状态,例如处于返回栈的

2021-12-16 15:00:13 1777

原创 Android ActivityResult 介绍

Android ActivityResult 介绍ActivityResult API 是 androidx.activity:activity 包引入的新 API,用来替代原有的 onActivityResult 获取上一个 Activity 返回的结果。被废弃的 startActivityForResult 和 onActivityResultstartActivityForResult从 ComponentActivity 的 startActivityForResult 方法 @Deprec

2021-11-17 12:40:15 4524

原创 Android Jetpack 之使用 ViewModel

Android Jetpack 之使用 ViewModelViewModel 是 Jetpack MVVM 架构中的 VM 部分。ViewModel 中的数据不会因为 Activity 重建而被销毁。以下的 ViewModel 保存了开始时间戳。public class ChronometerViewModel extends ViewModel { @Nullable private Long mStartTime; @Nullable public Long g

2021-01-11 00:00:16 169

原创 Android Jetpack 之使用 Room 操作数据库

Android Jetpack 之使用 Room 操作数据库Room 是 Android Jetpack 中用来处理数据库的框架,它可以用来替代原有的 SQLiteOpenHelper,简化数据库操作。Android Room with a View 是一个 Google Codelab 用来展示 Jetpack Room 用法的 app。它可以输入一个单词并自动刷新显示数据库中的所有单词。通过 Android Room with a View 这个项目可以熟悉 Android Jetpack 的 Li

2020-12-16 21:54:31 832 2

原创 Android AOP 框架 Lancet 应用与解析

Android AOP 框架 Lancet 应用与解析Lancet 是一个轻量级 Android AOP 框架。它可以用来替换某个方法的代码实现,或者在方法执行前后插入代码。Lancet 应用举例待修改的 MainActivity 如下:public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override prote

2020-12-08 21:14:22 2038 9

原创 Gradle Android Transform API 编译修改 class

Gradle Android Transform API 编译修改 classGradle 插件Android 的 Gradle 插件一般用作 Android 工程的编译构建流程。以 Android app 模块的 build.gradle 为例:apply plugin: 'com.android.application'‘com.android.application’ 插件是 Android Gradle Plugin(AGP) 提供的用作 app 编译的插件。Android librar

2020-11-03 10:07:21 1393

原创 Android Gradle 版本参数优化

Android Gradle 版本参数优化在 Gradle 项目结构中,每一个 Module 都对应一个 build.gradle。有时每个 Module 都会需要配置相同的版本号或者相同的版本依赖。为了解决相同参数重复配置的问题,可以在项目的根目录下增加一个公用的配置文件 common_config.gradle,在公用配置文件提供 Android app 模块、Android library 模块、java library 模块的公用配置。common_config.gradle每一个模块的 bu

2020-10-28 13:02:33 412

原创 Android Proguard 混淆

Android Proguard 混淆Android 项目可以在 build.gradle 开启 proguard 代码混淆。开启混淆的好处降低代码的可读性,缩短类和成员的名称,使反编译后的代码不容易被其他人阅读或破解。比如 APP \ SDK 对外发布正式版本时,通常需要做代码混淆。代码压缩。开启混淆后,项目中没有被任何地方执行到的代码会被 Proguard 优化,减少 APP\SDK 包体积。资源压缩。开启混淆后,项目中没有被使用的图片、字符串、布局等资源会从项目中移出,减少 APP\SDK

2020-09-07 19:46:23 375

原创 Android View 生成唯一 Id

Android View 生成唯一 Id可以使用 Hook LayoutInflater 的方法替换 SystemService 原有的 LayoutInflater,在自定义的 LayoutInflater 遍历每一个 view,为它们生成 md5 作为 view 的唯一 id。Hook LayoutInflaterHook LayoutInflater 的核心在于使用反射调用 registerService 方法,注册自定义的 LayoutInflater。public class Layout

2020-08-31 23:06:48 1270

原创 10. 正则表达式匹配

10. 正则表达式匹配给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。'.' 匹配任意单个字符'*' 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符

2020-06-20 21:36:40 205

原创 126. 单词接龙 II

126. 单词接龙 II给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则:每次转换只能改变一个字母。转换后得到的单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回一个空列表。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 beginWord 和 endWord 是非空的,且二者不相同。示例 1:输入:beginWor

2020-06-15 00:26:57 816

原创 Android 蓝牙 HFP 和 A2DP

Android 蓝牙 HFP 和 A2DPHFP(Hands Free Profile)和 A2DP (Advanced Audio Distribution Profile) 是经典蓝牙常用的两个协议。HFP 协议一般用来支持耳机打电话、接电话、挂断电话、拒接电话等操作。A2DP 协议一般用来听歌,传输音频立体声。ProfileProxyAndroid SDK 使用 BluetoothAdapter 的 getProfileProxy 获取每个具体的 Profile。获取 HFP: p

2020-06-02 00:12:26 5270 4

原创 146. LRU缓存机制

146. LRU缓存机制运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果密钥已经存在,则变更其数据值;如果密钥不存在,则插入该组「密钥/数据值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。

2020-05-25 23:49:10 106

原创 面试题24. 反转链表

面试题24. 反转链表定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL限制:0 <= 节点个数 <= 5000注意:本题与主站 206 题相同:https://leetcode-cn.com/problems/reverse-linked-list/来源:力扣(LeetCode)链接:https:

2020-05-16 23:27:30 152

原创 560. 和为K的子数组

560. 和为K的子数组给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。示例 1 :输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。说明 :数组的长度为 [1, 20,000]。数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。来源:力扣(LeetCode)链接:https://lee

2020-05-16 22:24:05 164

原创 236. 二叉树的最近公共祖先

236. 二叉树的最近公共祖先给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树:  root = [3,5,1,6,2,0,8,null,null,7,4]示例 1:输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q

2020-05-14 23:53:00 106

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除