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数据结构
Object
和Map
类似,都允许你按键存取一个值、删除键、检测一个键是否绑定了值,但它们也存在一些区别:
- 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])
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。