Skip to content

Commit 0c0331c

Browse files
author
钟辉
committed
feat: 新增笔记
1 parent 4b90325 commit 0c0331c

File tree

11 files changed

+305
-14
lines changed

11 files changed

+305
-14
lines changed

course/course-05-01/linked-list.js

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ c.next = d;
1313

1414
/** 遍历链表: 定义一个变量等于链表表头,在表头有值的情况下,不断将变量指向当前链表元素的下一个元素 */
1515

16-
// let p = a;
16+
let p = a;
1717

18-
// while (p) {
19-
// console.log(p.val);
20-
// p = p.next;
21-
// }
18+
while (p) {
19+
console.log(p.val);
20+
p = p.next;
21+
}
2222

2323
/** 插入元素 */
2424

@@ -41,14 +41,14 @@ c.next = d;
4141
*
4242
*/
4343

44-
const tmp = c.next;
45-
c.next = b;
46-
b.next = tmp;
47-
a.next = c;
44+
// const tmp = c.next;
45+
// c.next = b;
46+
// b.next = tmp;
47+
// a.next = c;
4848

49-
let p = a;
49+
// let p = a;
5050

51-
while (p) {
52-
console.log(p.val);
53-
p = p.next;
54-
}
51+
// while (p) {
52+
// console.log(p.val);
53+
// p = p.next;
54+
// }

course/course-06-01/set.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// 去重复
2+
const arr = [1, 2, 3, 2, 1, 4, 5];
3+
4+
/** Array.from 配合Set给数组去重 */
5+
const arr2 = Array.from(new Set(arr));
6+
/** 解构 配合Set给数组去重 */
7+
const arr3 = [...new Set(arr)];
8+
9+
// 判断某元素是否在集合中
10+
const set = new Set(arr);
11+
const has = set.has(6); /** false */
12+
13+
// 求交集
14+
const set2 = new Set([2, 3, 4]);
15+
/** 交集结果 */
16+
const set3 = new Set([...set].filter((item) => set2.has(item)));

course/course-06-01/笔记.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
### 集合简介
2+
3+
#### 一、集合是什么?
4+
5+
1. 集合是一种**无序且唯一**的数据结构;
6+
2. ES6 中有集合,名为 Set;
7+
3. 集合常用操作:去重、判断某元素是否在集合中、求交集;

course/course-06-02/set.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/**
2+
* @param {number[]} nums1
3+
* @param {number[]} nums2
4+
* @return {number[]}
5+
*/
6+
var intersection = function (nums1, nums2) {
7+
return [...new Set(nums1)].filter((item) => nums2.includes(item));
8+
};

course/course-06-02/笔记.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
### 6.2 (LeetCode 算法题) 两个数组的交集
2+
3+
#### 1.题目
4+
5+
LeetCode 地址:[两个数组的交集](https://leetcode-cn.com/problems/intersection-of-two-arrays/submissions/)
6+
7+
#### 2. 题目描述
8+
9+
给定两个数组,编写一个函数来计算它们的交集。
10+
11+
示例 1:
12+
13+
```
14+
输入:nums1 = [1,2,2,1], nums2 = [2,2]
15+
输出:[2]
16+
```
17+
18+
示例 2:
19+
20+
```
21+
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
22+
输出:[9,4]
23+
```
24+
25+
说明:
26+
27+
- 输出结果中的每个元素一定是唯一的。
28+
- 我们可以不考虑输出结果的顺序。
29+
30+
#### 3.解题思路
31+
32+
1. 根据题目描述得到结果是两个数组的交集并且会去重,所以考虑先对数组进行去重处理;
33+
2. 通过遍历的方式找出某个数组和另一个的相交部分;
34+
35+
#### 4.解题步骤
36+
37+
1. 对第一个数组利用`[...new Set(arr)]`去重复;
38+
2. 遍历去重后的数组,从另一个数组中筛选出同时存在于另一个数组中的元素;
39+
40+
#### 5. 解题代码(见同级目录文件:set.js)
41+
42+
#### 6. 分析算法的时间复杂度和空间复杂度
43+
44+
1. 时间复杂度:代码中一层循环,所以时间复杂度为 O(n);
45+
2. 空间复杂度:在执行代码中,把数组转换成了集合然后创建了一个新的数组,使用了一块新的内存空间,所以空间复杂度为 O(n), n 为被去重的数组去重后的长度;

course/course-06-03/set.js

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
let mySet = new Set();
2+
3+
mySet.add(1);
4+
mySet.add(2);
5+
mySet.add(2);
6+
mySet.add("hello world");
7+
mySet.add("hello world");
8+
let obj1 = { a: 1 };
9+
mySet.add(obj1);
10+
mySet.add(obj1);
11+
mySet.add({ a: 1 }); // 不会去重,对象{ a: 1 }和obj1内存地址不同
12+
13+
/** 总结: 集合会对添加的相同元素进行去重,其中数值相同但是存储空间不同的对象被认为是不同值,不会被去重 */
14+
15+
/** has()方法判断set是否包含该元素 */
16+
mySet.has(obj1);
17+
mySet.has(1);
18+
19+
/** delete()方法删除集合中的元素 */
20+
mySet.delete(obj1);
21+
22+
/** 遍历集合: 集合的key和value值是相同的 */
23+
24+
for (const item of mySet) {
25+
console.log(item);
26+
}
27+
28+
for (const item of mySet.keys()) {
29+
console.log(item);
30+
}
31+
32+
for (const item of mySet.values()) {
33+
console.log(item);
34+
}
35+
36+
for (const [key, value] of mySet.entries()) {
37+
console.log(key, value);
38+
}
39+
40+
/** Set转换成array */
41+
42+
const myArr1 = [...mySet];
43+
const myArr2 = Array.from(mySet);
44+
45+
/** Array转换成Set */
46+
47+
const mySet2 = new Set([1, 3, 4, 5]);
48+
49+
/** 求集合交集 */
50+
function intersection(set1, set2) {
51+
return new Set([...set1].filter((item) => set2.has(item)));
52+
}
53+
54+
/** 求集合差集: set1里存在而set2中不存在的 */
55+
function difference(set1, set2) {
56+
return new Set([...set1].filter((item) => !set2.has(item)));
57+
}

course/course-06-03/笔记.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
### 6.3 前端与集合: 使用 ES6 中的 Set
2+
3+
#### 一、Set 操作
4+
5+
- 使用 Set 对象: new、add、 delete、 has、size
6+
- 迭代 Set: 多种迭代方法、Set 与 Array 互转、求交集/差集

course/course-07-01/map.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
const map1 = new Map();
2+
3+
/** 新增键值对 */
4+
map1.set("name", "张三");
5+
map1.set({ name: "张三" }, "张三");
6+
7+
/** 根据键名获取值 */
8+
const name = map1.get("name");
9+
console.log("name", name);
10+
const name2 = map1.get({ name: "张三" });
11+
/** 输出undefined,因为传入的对象{ name: "张三" }和开始设置的对象内存空间不同,
12+
* 无法获取到开始设置的键名对应的值 */
13+
console.log("name2", name);
14+
15+
/** 删除键值对 */
16+
/** 删除单个 */
17+
map1.delete("name");
18+
/** 删除所有 */
19+
map1.clear();
20+
21+
/** 修改键值对的值 */
22+
map1.set("name", "李四");
23+
map1.set("name", "王五");

course/course-07-01/笔记.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
### 字典简介
2+
3+
#### 一、字典是什么?
4+
5+
- 字典,ES6 中有与之对应的数据类型就是 Map;
6+
- 字典也是一种存储唯一值的数据结构,使用`键值对`的形式存储;
7+
- 字典的常用操作:键值对的增删改查;
8+
9+
#### 二、ES6 中的 Map
10+
11+
##### 1. Objects 于 Maps 的比较
12+
13+
Maps 和 Objects 类似,都允许存储键值对,但是它们仍旧有一些不同点。
14+
15+
1. Objects 的键(key)只允许是整数(不能通过.语法访问,只能通过 obj[key]访问)、字符串和 symbol,Maps 的键(key)支持 Javascript 中的所有类型,也就是说 Maps 的键可以是数组或者对象;
16+
17+
2. Objects 中的键名可能和对象原型上的键名冲突,Maps 默认不包含任何键;
18+
19+
3. Maps 元素的顺序严格遵循插入的顺序,Objects 没有这一特性;
20+
21+
4. Maps 可以通过 size 属性获取键值对的个数,对象需要通过方法获取键的个数,如:Object.keys(obj).length;
22+
23+
5. Maps 本身就是可迭代的(`iterable`),可以直接被迭代,使用 for of 语法即可,但是 Objects 本身不是可迭代的,需要使用 for in(for of 只能迭代`iterable`);
24+
25+
6. 频繁增删键值对的场景,Maps 表现更好;

course/course-07-02/map.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/**
2+
* @param {number[]} nums1
3+
* @param {number[]} nums2
4+
* @return {number[]}
5+
*/
6+
var intersection = function (nums1, nums2) {
7+
const map1 = new Map();
8+
nums1.forEach((item) => {
9+
map1.set(item, true);
10+
});
11+
const result = [];
12+
nums2.forEach((item) => {
13+
if (map1.has(item)) {
14+
result.push(item);
15+
map1.delete(item);
16+
}
17+
});
18+
return result;
19+
};
20+
21+
/**
22+
*
23+
* @param {number[]} nums1
24+
* @param {number[]} nums2
25+
* @return {number[]}
26+
*/
27+
var intersection1 = function (nums1, nums2) {
28+
/** 利用Map的键名唯一性,对数组进行去重 */
29+
const map1 = new Map();
30+
nums1.forEach((item) => {
31+
map1.set(item, true);
32+
});
33+
const map2 = new Map();
34+
nums2.forEach((item) => {
35+
map2.set(item, true);
36+
});
37+
const result = [];
38+
/** 遍历Map,获取交集 */
39+
for (const key of map2.keys()) {
40+
if (map1.has(key)) {
41+
result.push(key);
42+
}
43+
}
44+
return result;
45+
};
46+
47+
/**
48+
* 缺点,创建了2个map,消耗内存空间大
49+
* 优点,简单容易理解
50+
*/

0 commit comments

Comments
 (0)