Skip to content

Commit 22c85b6

Browse files
committed
finish the homework of week 1
1 parent 0fd6bbe commit 22c85b6

8 files changed

Lines changed: 192 additions & 1 deletion

File tree

Week01/NOTE.md

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,44 @@
1-
学习笔记
1+
#第一周学习笔记
2+
3+
## 学习方法论
4+
5+
1. 五毒神掌,反复看视频,反复练习,职业化手法(手动狗头)
6+
2. 画出思维导图,方便记忆和复习
7+
3. 不要死磕,多看看别人的题解,理解大神的思路,写出简洁和fancy的代码
8+
4. 掌握一些固定的解题模板,比如:
9+
10+
```javascript
11+
/*** 暴力求解 ***/
12+
// 双层遍历
13+
for (let i = 0; i < len - 1; ++i) {
14+
for (let j = i + 1; j < len; ++j) {
15+
...
16+
}
17+
}
18+
19+
// 三层遍历
20+
for (let i = 0; i < len - 2; ++i) {
21+
for (let j = i + 1; j < len - 1; ++j) {
22+
for (let k = j + 1; k < len; ++k) {
23+
...
24+
}
25+
}
26+
}
27+
28+
/*** 循环中移动指针(代码精简) ***/
29+
while (p1 >= 0 && p2 >= 0) {
30+
nums1[p--] = nums1[p1] > nums2[p2] ? nums1[p1--] : nums2[p2--];
31+
...
32+
}
33+
34+
```
35+
## 知识点
36+
37+
* 时间复杂度和空间复杂度
38+
* 数组 (数组是栈和队列的基础)
39+
* 链表
40+
* 跳表
41+
*
42+
* 队列
43+
* 优先队列
44+
* 双端队列

Week01/arrayMerge.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* 合并两个有序数组
3+
* @param {number[]} nums1
4+
* @param {number} m
5+
* @param {number[]} nums2
6+
* @param {number} n
7+
* @return {void} Do not return anything, modify nums1 in-place instead.
8+
*/
9+
var merge = function(nums1, m, nums2, n) {
10+
let p1 = m - 1;
11+
let p2 = n - 1;
12+
let p = m + n - 1;
13+
while (p2 >= 0) {
14+
if (p1 >= 0) {
15+
nums1[p--] = nums1[p1] > nums2[p2] ? nums1[p1--] : nums2[p2--];
16+
} else {
17+
nums1[p--] = nums2[p2--];
18+
}
19+
}
20+
};

Week01/mergeTwoLists.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* function ListNode(val) {
4+
* this.val = val;
5+
* this.next = null;
6+
* }
7+
*/
8+
/**
9+
* 合并两个有序链表
10+
* @param {ListNode} l1
11+
* @param {ListNode} l2
12+
* @return {ListNode}
13+
*/
14+
var mergeTwoLists = function(l1, l2) {
15+
if (l1 == null) {
16+
return l2;
17+
} else if (l2 == null) {
18+
return l1;
19+
} else if (l1.val < l2.val) {
20+
l1.next = mergeTwoLists(l1.next, l2);
21+
return l1;
22+
} else {
23+
l2.next = mergeTwoLists(l1, l2.next);
24+
return l2;
25+
}
26+
};

Week01/moveZeroes.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/**
2+
* 移动0
3+
* @param {number[]} nums
4+
* @return {void} Do not return anything, modify nums in-place instead.
5+
*/
6+
var moveZeroes = function(nums) {
7+
// 双指针
8+
// 与删除排序数组中的重复项原地算法类似
9+
let j = 0;
10+
for (let i = 0; i < nums.length; ++i) {
11+
if (nums[i] != 0) {
12+
nums[j] = nums[i];
13+
if (i != j) {
14+
nums[i] = 0;
15+
}
16+
j++;
17+
}
18+
}
19+
};

Week01/plusOne.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/**
2+
* @param {number[]} digits
3+
* @return {number[]}
4+
*/
5+
var plusOne = function(digits) {
6+
let k = 1;
7+
for (let i = digits.length - 1; i >= 0; --i) {
8+
let temp = digits[i];
9+
digits[i] = (digits[i] + k) % 10;
10+
k = Math.floor((temp + k) / 10);
11+
}
12+
if (k > 0) {
13+
digits.unshift(1);
14+
}
15+
return digits;
16+
};

Week01/removeDuplicates.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* 删除排序数组中的重复项
3+
* 原地算法
4+
* @param {number[]} nums
5+
* @return {number}
6+
*/
7+
var removeDuplicates = function(nums) {
8+
if (!nums || nums.length <= 1) return nums;
9+
// 双指针法
10+
let head = 0;
11+
let tail = 1;
12+
while (tail < nums.length) {
13+
if (nums[head] != nums[tail]) {
14+
// 优化无重复项情况
15+
if (tail - head > 1) {
16+
nums[head+1] = nums[tail];
17+
}
18+
head++;
19+
}
20+
tail++
21+
}
22+
return head + 1
23+
};

Week01/rotate.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
3+
* @param {number[]} nums
4+
* @param {number} k
5+
* @return {void} Do not return anything, modify nums in-place instead.
6+
*/
7+
var rotate = function(nums, k) {
8+
if (!nums || nums.length <= 1) return nums;
9+
const reverse = (start, end) => {
10+
while (start < end) {
11+
let prev = nums[start];
12+
nums[start] = nums[end];
13+
nums[end] = prev;
14+
start++;
15+
end--;
16+
}
17+
}
18+
// 处理k大于数组长度的情况
19+
k = k % nums.length;
20+
// 反转数组
21+
reverse(0, nums.length - 1);
22+
// 反转前k个元素
23+
reverse(0, k - 1);
24+
// 反转第k个之后的元素
25+
reverse(k, nums.length - 1);
26+
return nums;
27+
};

Week01/twoSum.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
* 两数之和
3+
* @param {number[]} nums
4+
* @param {number} target
5+
* @return {number[]}
6+
*/
7+
var twoSum = function(nums, target) {
8+
let map = new Map();
9+
for (let i = 0; i < nums.length; ++i) {
10+
if (map.has(nums[i])) {
11+
return [map.get(nums[i]), i];
12+
} else {
13+
map.set(target - nums[i], i);
14+
}
15+
}
16+
return [];
17+
};

0 commit comments

Comments
 (0)