ARTS - 2020.08.10 ~ 2020.08.16

ARTS打卡 - 11

1. Algorithm

18. 4Sum

之前做过一道三数之和的题,这道题是延申。在一个整数数组中找出四个子数组,使其之和等于给定的数字,要求不能有重复。整体的解题思路和三数之和是一样的:

  1. 边界条件判断
  2. 对原数组排序,用的是快排,O(nlogn)。
  3. 三层循环:这是与三数之和唯一不同的地方,实际上是在三数之和解法的基础上在最外层增加了一个循环,即执行双指针之前将前两个数字看作一个整体,变相的 “三数之和”。
  4. 计算判断:一头一尾指针,与一个顺序指针,计算三个数字(实际上是4个,只是把前两个的和看成一个)大小,如果小于目标数字,左指针右移,如果大于目标数字,右指针左移。
  5. 去重判断:如果相临两个数字相等,说明是重复计算,并且判断左指针与右指针与下一位元素是否相等,相等则也要跳过。

虽然之前做过三数之和,但是在提交的时候还是失败了四次,主要问题都在循环的边界条件以及去重判断上,还是代码写的不严谨。

2. Review

Complex UI/Animations on Android

这篇文章主要是用Kotlin、自定义动画、自定义View实现了一个复杂的动画,没有使用MotionLayout,XML动画等等。实现了一个这样的效果:

https://thumbs.gfycat.com/HairyWellwornGelding-mobile.mp4

文章讲了一比较关键实现,看下来觉得比较有趣的,会找时间去自己也实现一下,完成之后相信对于一些动画的实现也会增加很多。

3. Tip

  • kotlin lazy的函数定义:

    1
    2
    3
    4
    fun <T> lazy(
    mode: LazyThreadSafetyMode,
    initializer: () -> T
    ): Lazy<T>

    其中LazyThreadSafetyMode可以传递三个不同的mode:

    1. SYNCHRONIZED: 加锁保证仅仅能够在单线程中进行init操作,默认为该模式。
    2. PUBLICATION:initializer 函数可以并发调用多次,但是仅仅会将第一次的返回值作为lazy的值。
    3. NONE:不会进行任何处理,如果多个线程同时调用,它的表现是不确定的,使用这个mode的前提是要保证仅在单线程中使用initializer函数。
  • https://juejin.im/post/6844903860746584072

    这篇文章很详细的讲了在Windows下如何使用source insight 导入Android framework的源码。虽然这样没有办法对源码进行编译(主要还是是因为我的电脑硬盘没有充足的空间搞一个Ubuntu的虚拟机😰),但是在windows下,使用source insight也可以很方便的看源码,这个工具也支持跳转、搜索等等IDE的功能。

4. Share

Linux系统对于文本处理最好最快的方式应该就是使用 grep / sed / awk命令做一些文本操作了,这两篇文章详细讲了如何使用sed和awk命令,以及一些参数的使用方法。如果能熟练的使用这些命令的话,对平常实现一些自动化脚本是非常有用的。