Posts
All the articles I've posted.
鸿蒙开发RSA加解密实现方案
鸿蒙开发入门篇
此方案基于ArkTs API9 实现,解决了分段加解密,解密后中文乱码的问题 背景 随着鸿蒙Next即将发布,纯血鸿蒙将不再兼容Android APK应用的呼声也越来越多,且我司的Android应用因为上架了华为应用市场,最近也一直被华为官方的人员邀请加入鸿蒙开发大家庭。此时作为一个Android开发...
数据结构与算法之美学习笔记
基础篇之二分查找(下)
基础篇之二分查找(下) 如何快速定位IP对应的省份地址? 通过IP地址来查找IP归属地的功能并不复杂,它是通过维护一个很大的IP地址库来实现的。地址库中包括IP地址范围和归属地的对应关系。 当我们要查询202.102.133.13这个IP地址归属地时,我们就在地址库中搜索,发现这个IP地址落在[20...
数据结构与算法之美学习笔记
基础篇之二分查找(上)
基础篇之二分查找(上) 假设我们有1000万个整数数据,每个数据占8个字节,如何设计数据结构和算法,快速判断某个整数是否出现在这1000万个数据中?如果希望这个功能内存空间占用最多不超过100MB,该如何实现呢? 无处不在的二分思想 二分查找是一种非常简单易懂的快速查找算法。例如:猜字游戏,随机0到...
数据结构与算法之美学习笔记
基础篇之排序优化
基础篇之排序优化 你知道如何实现一个通用的、高性能的排序函数? 在平时的开发中,我们经常直接使用平台编程语言所提供的排序函数,比如Java的Arrays.sort()方法,你知道这些排序函数是如何实现的吗?底层都利用了哪种排序算法呢? 如何选择合适的排序算法? 要实现一个通用的、高效率的排序函数,...
数据结构与算法之美学习笔记
基础篇之线性排序
基础篇之线性排序 你知道如何根据年龄快速地给100万用户排序吗? 何为线性排序 排序算法的时间复杂度是线性的算法叫做线性排序(Linear Sort)。 本篇介绍三种时间复杂度是O(n)的线性排序:桶排序、计数排序、基数排序。这三个算法都不是基于比较的排序算法,都不涉及元素之间的比较操作。这三种排...
数据结构与算法之美学习笔记
基础篇之排序(下)
基础篇之排序(下) 你知道如何在O(n)的时间复杂度内查找一个无序数组中的第K大元素吗? 归并排序的原理 如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。 归并排序使用的就是分治思想。分治,就是分而治之,将一...
数据结构与算法之美学习笔记
基础篇之排序(上)
基础篇之排序(上) 插入排序和冒泡排序的时间复杂度相同,都是O(n²),在实际的软件开发中,为什么我们更倾向于使用插入排序算法而不是冒泡排序算法呢? 如何分析一个“排序算法” 分析一个排序算法,可以从以下几个方面入手 排序算法的执行效率 对于排序算法执行效率的分析,从这几...
数据结构与算法之美学习笔记
基础篇之递归
基础篇之递归 现在很多 App 都有这个推荐注册返佣金功能。这个功能中,用户 A 推荐用户 B 来注册,用户 B 又推荐了用户 C 来注册。我们可以说,用户 C 的“最终推荐人”为用户 A,用户 B 的“最终推荐人”也为用户 A,而用户 A 没有“最终推荐人”。基于此,如何查找指定用户的“最终推荐人”? ...
数据结构与算法之美学习笔记
基础篇之队列
基础篇之栈 当我们向固定大小的线程池中请求一个线程时,如果线程池中没有空闲资源了,这个时候线程池如何处理这个请求?是拒绝请求还是排队请求?各种处理策略又是怎么实现的呢? 如何理解“队列” 可以把它想象成排队买票,先来的先买,后来的人只能站在末尾,不允许插队。先进者先出,这就是典型的“队列”。 我们...
数据结构与算法之美学习笔记
基础篇之栈
基础篇之栈 你知道如何实现浏览器的前进和后退功能吗? 如何理解“栈” 我们可以把栈看成是一摞叠在一起的盘子。在放盘子的时候都是从下往上一个一个放,取盘子的时候都是从上往下一个一个地依次取,不能从中间任意抽出。后进先出,先进后出,这就是典型的“栈”结构。 栈是一种“操作受限”的线性表,只允许在一...
数据结构与算法之美学习笔记
基础篇之链表
基础篇之链表 你知道如何用链表来实现LRU缓存淘汰策略吗? 链表结构 链表和数组一样,是非常基础且非常常用的数据结构,这两者有什么区别? 底层存储结构 数组需要一块连续的内存空间来存储,对内存的要求比较高。如果我们申请一个100MB大小的数组,当内存中没有连续的、足够大的...
数据结构与算法之美学习笔记
基础篇之数组
基础篇之数组 在大部分编程语言中,数组都是从0开始编号的,你知道为什么数组要从0开始编号,而不是从1开始编号呢?从1开始不是更符合人类的思维习惯吗? 什么是数组 数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。 几个关键词 线性表(L...
数据结构与算法之美学习笔记
入门篇
入门篇 什么是数据结构?什么是算法? 从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。 从狭义上讲,是指某些著名的数据结构和算法,比如队列、栈、堆、二分查找、动态规划等。 数据结构和算法有什么关系? 数据结构和算法是相辅相成的。数据结构是为算法服务的,算法要作用在特定的数据结构...
一个关于CoordinatorLayout嵌套滚动的bug
CoordinatorLayout + AppBarLayout + RecyclerView+Header
采用CoordinatorLayout + AppBarLayout + RecyclerView + Header引出的一个bug Bug展示 Bug简述 如上图所展示的效果,首页第一次在RecyclerView区域外是响应手动滑动事件的,但是一旦在底部RecyclerView区域有滚动后,再...
解决Android Studio依赖库版本不一致的问题
强制指定第三方依赖库内部所依赖的库的版本号
具体问题 在项目开发和迭代过程中,我们不得不依赖越来越多的第三方库,有些是为了不重复造轮子,有些是要用别人的功能,比如依赖一些直播平台的库。依赖的库越多,就越容易造成依赖版本冲突的问题。在最近项目上线,空闲下来的时间,准备来解决之前一直没有顾得上解决的一个依赖问题,虽然能编译通过,总感觉有一条红色警告线看着不爽...
RxJava操作符
RxJava常用操作符大全
本篇都是基于RxJava2.0的操作符说明,由于操作符太多,本篇只列举常用的操作符说明 创建操作符 create 通过实现ObservableOnSubscribe接口的subscribe来创建,该方法有一个事件发射器ObservableEmitter,通过它来向下游发射事件...
从代码被盗到aar混淆打包
日防夜防,家贼难防
背景 我们公司从17年10月份开始规划的考研一对多平台项目锐跨考,在经过不到2个月的时间,从无到有开发完成,就在年后大家上班没多久,意外发现了一款名为橙啦的App简直就是我们锐跨考的复制版,除了替换了logo外,别的界面简直一模一样,最关键的是在我们平台注册的用户可以直接在橙啦app上登录。天呐,我还是第一次遇...
MarkDown语法三
MarkDown目录生成
此篇博文乃MarkDown的结尾篇,单独讲述MarkDown目录的生成,因为篇幅较长,所以单独作为一篇博文发表,如果你对MarkDown的语法还不是很了解,请阅读MarkDown语法一和MarkDown语法二 在编写一些技术开发文档的时候,通常篇幅较长,为了快速定位和浏览,可以生成篇内目录。下面是 Kr...
MarkDown语法二
MarkDown高级进化
在阅读此篇博文时,你应该已经掌握了MarkDown的基础语法和基本使用,如果还没有掌握,请先阅读我之前写的博文MarkDown语法一,本篇博文将教授大家MarkDown的高级使用,比如用 flowchart.js 描述流程图,图片大小的调整,图片链接等 声明 MarkDown的高级使用,有些功能属于拓...
MarkDown语法一
MarkDown快速入门
Markdown 是一种轻量级标记语言,创始人为約翰·格魯伯(John Gruber)。 它允许人们“使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档” 标题 MarkDown支持6级标题,在行首插入1到6个#,并在#后加一个空格,对应1到6级标题 # 一级标题 ##...