1. 学习回顾

  • 时间:2020年2月24日 ~ 3月1日
  • 本周学习时长:7 次,共 15 小时
  • 学习主要内容:本周更多时间是花在了LeetCode上,书读的不多,《大话数据结构》第3章,学习顺序存储结构和单链表结构。

2. 收获

2.1. 学习数据结构和算法不要死记硬背,重点是学习背后的思想和技巧

在LeetCode上解无重复字符的最长子串这道题时,最初想到的做法是:

  • 借助tmpString保存子字符串
  • 遍历字符串每一个元素时,若tmpString中没有这个元素,就累加上去,若有,就与当前的最长子串长度maxLen对比,取最大的,然后将tmpString清空

后来,看别人解题时,有一个更好的思路,就是让指针不回溯,刚开始看代码的时候,不是很明白,特别是代码中每一个变量的含义;最后就用了下面的表格梳理了每次程序执行的过程。
代码每次执行过程的图解

在这个过程中,我有了以下收获:

  • 学习别人的优秀算法时,可以先用最笨的方式,将执行的过程可视化出来,这样,很容易就能理解变量的含义和作用;
  • 接下来,要去体会作者的解题思路;这个过程可以通过举例子的方法,结合作者的方法,反复揣摩,直到自己真的理解;
  • 最后,反复的练习,注意不是默写,而是在有完整的解题思路时,反复练习;练习时,还可以通过局部调整代码,产生不同的结果,进一步的去巩固解题思路。
2.2. 链表相关知识

在LeetCode上解两数相加这道题时,对链表还不了解,不太理解下面语句的含义:

let head = new ListNode();
let cur = head;

当时就只能死记硬背,后来看了《大话数据结构》第3章,找到了答案:

  • 链式存储结构由Node组成,每一个Node由数据域和指针域组成,数据域存放数据元素,指针域存放下一个节点的地址空间
  • 通常为了方便操作,会在第一个Node节点前设置一个头节点,它的数据域可以不存储任何信息,也可以存储该链表的一些公共数据,如长度,链表名字等;头节点与头指针是有区别的,头节点是为了操作的便利和统一(统一了第一个节点与其他后续节点的操作),可它不是必要的元素,但头指针是必要元素
  • 若线性表为空表,头结点的指针域为空
2.3. JS的Map数据结构

ObjectMap类似,都允许你按键存取一个值、删除键、检测一个键是否绑定了值,但它们也存在一些区别:

  • Map是ES6中出现的一种数据结构
  • 一个Object的键只能是字符串或者Symbols,但一个Map的键可以是任意值,包括函数、对象、基本类型
  • Map 中的键值是有序的,而添加到对象中的键则不是;因此,当对它进行遍历时,Map对象是按插入的顺序返回键值
var map = new Map();
map.set(1, "a");
map.set(true, "b");
map.has(1);
map.get(1);
for (var key of map) {
    console.log(key, key[1])
}

mj4ever
0 声望0 粉丝

before i fall