# 第三十五周ARTS总结

# Algorithm

0ms | 100.00% Run time
34.6MB | 100.00% Memory

public int firstMissingPositive(int[] nums) {
    // Arrays.sort(nums); 该排序的时间复杂度为O(nlogn),所以不能使用

    int ans = 1;

    // 由于int只能存储32个数的状态,因此直接采用数组
    // 利用warehouse来存储每个位置的状态,1代表nums中有该值,否则无
    // 本来容量想直接设置为Integer.MAX_VALUE的,但是没必要,而且会OutOfMemory
    // warehouse容量最大不需要超过nums的长度+2
    boolean[] warehouse = new boolean[nums.length + 2];

    // 时间复杂度:O(n)
    for (int index : nums) {
        if (index <= 0 || index >= warehouse.length) {
            continue;
        }

        warehouse[index] = true;
    }

    // 时间复杂度:O(n)
    for (int i = 1; i < warehouse.length; i++) {
        if (!warehouse[i]) {
            ans = i;
            break;
        }
    }

    return ans;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# Review

# Tip

  • Handler机制:
    • 目的:线程间通信
    • 涉及到的主要类:
      • Handler:负责消息的发送与处理
      • Looper:负责管理MessageQueueLooper会不断的从MessageQueue取出消息,交给Handler处理
      • MessageQueue:消息队列,负责存放消息
        注:一个线程中可以有多个Handler,但只有一个Looper和一个MessageQueue
    • 注意点:
      • 在子线程使用Handler前一定要先为子线程创建Looper,创建的方式是直接调用Looper.prepare()方法
      • 在同一个线程里,Looper.prepare()方法不能被调用两次
      • 只有调用了Looper.loop()方法,Handler机制才能正常工作
      • Looper.loop()方法一定要在调用了Looper.prepare()方法之后调用
      • 不要在主线程调用Looper.prepare()方法
      • 当我们在子线程使用Handler时,如果Handler不再需要发送和处理消息,那么一定要退出子线程的消息轮询
    • 当一个线程有多个Handler,那会由哪个Handler来处理这个消息呢:发该消息的那个
  • Activity<meta-data>加上如下代码用于声明此Activity的逻辑父级
    <activity android:name=".DisplayMessageActivity"
              android:parentActivityName=".MainActivity">
        <!-- The meta-data tag is required if you support API level 15 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".MainActivity" />
    </activity>
    
    1
    2
    3
    4
    5
    6
    7
  • Android安全功能:
    • Android操作系统是一种多用户Linux系统,其中的每个应用都是一个不同的用户;
    • 默认情况下,系统会为每个应用分配一个唯一的Linux用户ID(该ID仅由系统使用,应用并不知晓)。系统会为应用中的所有文件设置权限,使得只有分配给该应用的用户ID才能访问这些文件;
    • 每个进程都拥有自己的虚拟机(VM),因此应用代码独立于其他应用而运行;
    • 默认情况下,每个应用都在其自己的Linux进程内运行。Android系统会在需要执行任何应用组件时启动该进程,然后当不再需要该进程或系统必须为其他应用恢复内存时,其便会关闭该进程。
  • ViewPage2的优势
    • 基于RecyclerView实现
    • 支持滑动方向的一键切换
    • 支持禁止用户滑动页面
    • 支持通过代码方式模拟用户滚动页面
    • 支持同时添加多个PageTransformer
    • 支持DiffUtil
    • 支持RTL(right-to-left)布局
  • HashMap的实现方式
    • jdk1.6 jdk1.7:采用数组+链表实现
    • jdk1.8:采用数组+链表+红黑树实现,当链表长度超过阈值时,自动转为红黑树

# Share

暂无内容

更新时间: 10/20/2022, 7:04:01 AM