# 第四十周ARTS总结

# Algorithm

23ms | 15.65% Run time
39.9MB | 58.21% Memory

public List<List<Integer>> permuteUnique(int[] nums) {
    if (nums.length == 0) {
        return new ArrayList<>();
    }

    // 数组元素个数大于等于1的时候
    return recursivePermute(nums, 0);
}

/**
 * 获取从index开始后边所有数的全排列
 *
 * @param nums  给定数组
 * @param index 开始索引
 * @return
 */
public List<List<Integer>> recursivePermute(int[] nums, int index) {
    List<List<Integer>> ans = new ArrayList<>();

    // 最后一个数的全排列
    if (nums.length - index == 1) {

        List<Integer> item = new ArrayList<>();
        item.add(nums[index]);

        ans.add(item);
    } else {
        // 获取index以后所有数的全排列
        List<List<Integer>> temp = recursivePermute(nums, index + 1);

        // 加上当前数(插入到所有排列的所有空隙,注意去重)
        for (List<Integer> list : temp) {
            for (int i = 0; i <= list.size(); i++) {
                List<Integer> item = new ArrayList<>(list);
                item.add(i, nums[index]);
                if (!ans.contains(item)) {
                    ans.add(item);
                }
            }
        }
    }

    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
31
32
33
34
35
36
37
38
39
40
41
42
43
44

# Review

# Tip

  • 关于MIUI系统刷机
    • 卡刷需要使用对应的官方版本才行
    • 稳定版的MIUI系统需要点击MIUI图标十下才能解锁额外功能
    • 完整root过程:刷机到开发版→解锁Bootloder→开启官方root→用ADB命令解锁system
  • Python中的可变对象与不可变对象
    • 可变对象:列表、字典、自定义对象
    • 不可变对象:intlongboolfloatstrtuple
  • Pythonis==的区别
    • ==比较的是内容,is比较的是内存地址
    • 对于小整数[-5,256]区间内的整数,Python会创建小整数对象池,这些对象一旦创建,就不会回收,所有新创建的在这个范围的整数都是直接引用他即可。所以造成在[-5,256]区间内的整数不同变量只要值相同,引用地址也相同
    • Python有个intern机制,简单说就是维护一个字典,这个字典维护已经创建字符串(key)和它的字符串对象的地址(value),每次创建字符串对象都会和这个字典比较,没有就创建,重复了就用指针进行引用就可以了。相当于Python对于字符串也是采用了对象池原理
    • 如果字符串(含有空格),不可修改,没开启intern机制,不共用对象
    • 以上特点Pycharm都作了优化
  • CPU的组成 [1] (opens new window)
    • 寄存器
    • 控制器
    • 运算器
    • 时钟
  • CPU是一系列寄存器的集合体 [2] (opens new window)
    • 程序计数器(只有一个):用于存储下一条指令所在单元的地址
    • 标志寄存器(只有一个):保存当前运算的值,主要用于判断正、负和零三种状态
    • 累加寄存器(只有一个):存储运行的数据和运算后的数据
    • 指令寄存器(只有一个):存储正在被运行的指令,CPU内部使用,程序员无法对该指令进行读写
    • 栈寄存器(只有一个):存储栈区域的起始位置
    • 基址寄存器(可以多个):存储数据内存的起始位置
    • 变址寄存器(可以多个):存储基址寄存器的相对地址
    • 通用寄存器(可以多个):存储任意数据
  • 函数调用机制 [3] (opens new window):函数的调用和返回很重要的两个指令是callreturn指令,再将函数的入口地址设定到程序计数器之前,call指令会把调用函数后要执行的指令地址存储在名为栈的主存内。函数处理完毕后,再通过函数的出口来执行return指令。return指令的功能是把保存在栈中的地址设定到程序计数器。
  • CPU指令执行过程 [4] (opens new window)
    • 取指令
    • 指令译码
    • 执行指令
    • 访问取数
    • 结果写回

# Share

暂无内容

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