Skip to content

Commit 518b897

Browse files
author
caiyongmin
committed
feat: reform file and full dose code enhancement
1 parent e27e631 commit 518b897

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+504
-184
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ src/template-string
2525

2626
# Markdown
2727
*.md
28+
!src/dsa/**/*.md
2829

2930
# Directory for instrumented libs generated by jscoverage/JSCover
3031
lib-cov

README.md

+86-68
Original file line numberDiff line numberDiff line change
@@ -1,84 +1,102 @@
11
# awesome-coding-javascript
22

3-
📌 coding about JavaScript basic principles and data structures and algorithms, verify logic with unit test.
3+
📌 持续构建个人的源码库,更多信息请看[这篇文章]()
44

55
[![codecov](https://codecov.io/gh/caiyongmin/codes/branch/master/graph/badge.svg)](https://codecov.io/gh/caiyongmin/codes) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](README.md)
66

7-
**这里得有一个目录**
7+
---
88

9-
## JavaScript
9+
## 一、JavaScript 原生和常用方法的代码实现
1010

11-
- [x] [bind](./src/javascript/bind)
12-
- [x] [call](./src/javascript/call)
13-
- [x] [apply](./src/javascript/apply)
14-
- [x] [new](./src/javascript/new)
15-
- [x] [deepclone](./src/javascript/deepclone)
16-
- [x] [throttle](./src/javascript/throttle)
17-
- [x] [debounce](./src/javascript/debounce)
18-
- [x] [URL SearchParams](./src/javascript/searchParams)
19-
- [x] [Promise](./src/javascript/promise)
20-
- [x] [async/await](./src/javascript/async)
21-
- [x] [event-emitter](./src/javascript/event-emitter)
22-
- [x] [currify](./src/javascript/currify/currify.js)
23-
- [x] [template string](./src/javascript/template-string)
11+
- [x] [call](./src/javascript/call) / [apply](./src/javascript/apply) / [bind](./src/javascript/bind) 实现
12+
- [x] [new](./src/javascript/new) 实现
13+
- [x] [deepclone](./src/javascript/deepclone) 深拷贝实现
14+
- [x] [throttle](./src/javascript/throttle) / [debounce](./src/javascript/debounce) 防抖/节流实现
15+
- [x] [URL 参数解析](./src/javascript/searchParams) 实现
16+
- [x] [Promise](./src/javascript/promise) 实现
17+
- [x] [async/await](./src/javascript/async) 实现
18+
- [x] [订阅/发布](./src/javascript/event-emitter) 实现
19+
- [x] [柯里化](./src/javascript/currify/currify.js) 实现
20+
- [x] [模板字符串](./src/javascript/template-string) 实现
2421

25-
## Library & Plugin
22+
## 二、常用的库和插件的代码实现
2623

27-
- [x] [Babel](./src/bundler/babel)
24+
- [x] [Webpack](./src/bundler/webpack) 的模拟实现
25+
- [x] [Webpack-Plugin](./src/bundler/webpack-plugin) 的实现
26+
- [x] [Babel](./src/bundler/babel) 的模拟实现
2827
- input => [tokenizer](./src/bundler/babel/lib/tokenizer.js) => tokens
2928
- tokens => [parser](./src/bundler/babel/lib/parser.js) => AST
3029
- AST => [transformer](./src/bundler/babel/lib/transformer.js) => newAST
3130
- newAST => [codeGenerator](./src/bundler/babel/lib/codeGenerator.js) => output
32-
- [x] [Webpack](./src/bundler/webpack)
33-
- [x] [Webpack-Plugin](./src/bundler/webpack-plugin)
34-
- [x] [Babel-Plugin](./src/bundler/babel-plugin)
35-
- [x] [Redux](./src/bundler/redux)
36-
- [x] [Router](./src/bundler/router)
31+
- [x] [Babel-Plugin](./src/bundler/babel-plugin) 的实现
32+
- [x] [Redux](./src/bundler/redux) 的模拟实现
33+
- [x] [Router](./src/bundler/router) 的模拟实现
3734
- [hashRouter](./src/bundler/router/hashRouter.js)
3835
- [historyRouter](./src/bundler/router/historyRouter.js)
36+
- [x] [React](https://github.com/caiyongmin/creact) 的模拟实现(在另外一个仓库,使用 TypeScript 实现)
37+
- [x] [Egg.js](https://github.com/caiyongmin/tiny-egg) 的模拟实现(在另外一个仓库,暂无单元测试)
3938

40-
## DSA
41-
42-
- [String](./src/dsa/string)
43-
- [x] [longest common substring](./src/dsa/string/longestCommonSub.js)
44-
- [x] [KMP](./src/dsa/string/kmp.js)
45-
- [Number](./src/dsa/number)
46-
- [x] [thousands format](./src/dsa/number/thousands.js)
47-
- [Array](./src/dsa/array)
48-
- [x] [remove duplicate](./src/dsa/array/unique.js)
49-
- [x] [two sum](./src/dsa/array/twoSum.js)
50-
- [x] [three sum](./src/dsa/array/threeSum.js)
51-
- [Traversal]()
52-
- [x] [DFS](./src/dsa/dfs/dfs.js)
53-
- [x] [BFS](./src/dsa/bfs/bfs.js)
54-
- [Sort](./src/dsa/sort)
55-
- [x] [bubble sort](./src/dsa/sort/bubbleSort.js)
56-
- [x] [selection sort](./src/dsa/sort/selectionSort.js)
57-
- [x] [insert sort](./src/dsa/sort/insertSort.js)
58-
- [x] [merge sort](./src/dsa/sort/mergeSort.js)
59-
- [x] [quick sort](./src/dsa/sort/quickSort.js)
60-
- [Tree](./src/dsa/tree)
61-
- [x] [binary tree](./src/dsa/tree/binaryTree.js)
62-
- [x] [binary search tree](./src/dsa/tree/binarySearchTree.js)
63-
- [x] [tree symmetry](./src/dsa/tree/treeSymmetry.js)
64-
- [x] [tree traversal](./src/dsa/tree/treeTraversal.js)
65-
- [x] [rebuild tree](./src/dsa/tree/rebuildTree.js)
66-
- [x] [invert tree](./src/dsa/tree/invertTree.js)
67-
- [Linked List](./src/dsa/linked-list)
68-
- [x] [linked list](./src/dsa/link-list/linkedList.js)
69-
- [x] [merge linked list](./src/dsa/link-list/mergeList.js)
70-
- [x] [reverse linked list](./src/dsa/link-list/reverseList.js)
71-
- [Recursion & Loop](./src/dsa/recursion)
72-
- [x] [jump floor](./src/dsa/recursion/jumpFloor.js)
73-
- [Double Pointer](./src/dsa/doublePointer)
74-
- [x] [find Kth to tail](./src/dsa/doublePointer/findKthToTail.js)
75-
- [x] [reOrder array](./src/dsa/doublePointer/reOrderArray.js)
76-
- [Backdate Programming](./src/dsa/backdateProgramming)
77-
- [x] [find all node path in tree](./src/dsa/backdateProgramming/findAllNodePath.js)
78-
- [x] [get all combination equal to target](./src/dsa/backdateProgramming/getAllCombinEqualTarget.js)
79-
- [Dynamic Programming](./src/dsa/dynamicProgramming)
80-
- [x] [min edit distance](./src/dsa/dynamicProgramming/minEditDistance.js)
81-
- [x] [min path sum](./src/dsa/dynamicProgramming/minPathSum.js)
82-
- [Greedy Programming](./src/dsa/greedyProgramming)
83-
- [x] [best time to buy and sell stock](./src/dsa/greedyProgramming/bestTimeBuyAndSellStock.js)
84-
- [x] [distribution cookie](./src/dsa/greedyProgramming/distributionCookie.js)
39+
## 三、JavaScript 实现的数据结构和常用算法
40+
41+
### 数据结构
42+
43+
- [Linked List](./src/dsa/linked-list) 链表
44+
- [x] [linked list](./src/dsa/linked-list/linkedList.js) 双链表实现
45+
- [x] [merge linked list](./src/dsa/linked-list/mergeList.js) 合并两个链表
46+
- [x] [reverse linked list](./src/dsa/linked-list/reverseList.js) 反转链表
47+
- [Array](./src/dsa/array) 数组
48+
- [x] [remove duplicate](./src/dsa/array/unique.js) 数组去重
49+
- [x] [two sum](./src/dsa/array/twoSum.js) 两个数之和
50+
- [x] [three sum](./src/dsa/array/threeSum.js) 三个数之和
51+
- [x] [Heap](./src/dsa/heap)
52+
- [x] [get min K nums](./src/dsa/heap/getMinKNums.js) 获取一段数组里面最小的 k 个数
53+
- [x] [Stack](./src/dsa/stack)
54+
- [x] [Queue](./src/dsa/queue) 队列
55+
- [ ] [Set](./src/dsa/set) 集合
56+
- [ ] [Hash Table](./src/dsa/hash) 散列表
57+
- [Tree](./src/dsa/tree)
58+
- [x] [binary tree](./src/dsa/tree/binaryTree.js) 二叉树
59+
- [x] [tree traversal](./src/dsa/tree/treeTraversal.js) 二叉树的先序/中序/后序非递归遍历
60+
- [x] [rebuild tree](./src/dsa/tree/rebuildTree.js) 重建二叉树
61+
- [x] [invert tree](./src/dsa/tree/invertTree.js) 翻转二叉树
62+
- [x] [tree symmetry](./src/dsa/tree/treeSymmetry.js) 是否是镜像二叉树
63+
64+
### 算法
65+
66+
- [Sort](./src/dsa/sort) 排序
67+
- [x] [bubble sort](./src/dsa/sort/bubbleSort.js) 冒泡排序
68+
- [x] [selection sort](./src/dsa/sort/selectionSort.js) 选择排序
69+
- [x] [insert sort](./src/dsa/sort/insertSort.js) 插入排序
70+
- [x] [merge sort](./src/dsa/sort/mergeSort.js) 归并排序
71+
- [x] [quick sort](./src/dsa/sort/quickSort.js) 快速排序
72+
- [Divide and conquer]() 分治
73+
- [x] [binary search tree](./src/dsa/tree/binarySearchTree.js) 二叉搜索树
74+
- [Recursion](./src/dsa/recursion) 递归
75+
- [x] [jump floor](./src/dsa/recursion/jumpFloor.js) 跳台阶
76+
- [x] [find all node path in tree](./src/dsa/recursion/findAllNodePath.js) 找出二叉树中结点值的和为输入整数的所有路径
77+
- [Traversal]() 遍历
78+
- [x] [DFS](./src/dsa/dfs/dfs.js) 深度优先遍历
79+
- [x] [BFS](./src/dsa/bfs/bfs.js) 广度优先遍历
80+
- [Double Pointer](./src/dsa/doublePointer) 双指针
81+
- [x] [find Kth to tail](./src/dsa/doublePointer/findKthToTail.js) 求链表中倒数第 k 个结点
82+
- [x] [reOrder array](./src/dsa/doublePointer/reOrderArray.js) 数组重排序,奇数在前半部分,偶数在后半部分
83+
- [Dynamic Programming](./src/dsa/dynamicProgramming) 动态规划
84+
- [x] [min edit distance](./src/dsa/dynamicProgramming/minEditDistance.js) 最小编辑距离
85+
- [x] [min path sum](./src/dsa/dynamicProgramming/minPathSum.js) 最少路径问题
86+
- [Backdate Programming](./src/dsa/backTracking) 回溯算法
87+
- [ ] [solve N queens](./src/dsa/backTracking/solveNQueens.js) N 皇后问题
88+
- [Greedy Programming](./src/dsa/greedyProgramming) 贪心算法
89+
- [ ] [best time to buy and sell stock](./src/dsa/greedyProgramming/bestTimeBuyAndSellStock.js) 买股票
90+
- [ ] [distribution cookie](./src/dsa/greedyProgramming/distributionCookie.js) 分发饼干
91+
92+
### 其他
93+
94+
- [String](./src/dsa/string) 字符串
95+
- [x] [longest common substring](./src/dsa/string/longestCommonSub.js) 最长公共子串
96+
- [x] [KMP](./src/dsa/string/kmp.js) KMP 算法求子串的索引位置
97+
- [Number](./src/dsa/number) 数字
98+
- [x] [thousands format](./src/dsa/number/thousands.js) 千分位
99+
100+
---
101+
102+
Welcome to commit [issue](https://github.com/caiyongmin/awesome-coding-javascript/issues) & [pull request](https://github.com/caiyongmin/awesome-coding-javascript/pulls) !

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
2-
"name": "codes",
2+
"name": "awesome-coding-javascript",
33
"version": "1.0.0",
4-
"description": "😈 talk is cheap, show me the code",
4+
"description": "talk is cheap, show me the code",
55
"scripts": {
66
"test": "jest",
77
"test:watch": "jest --watch",

src/dsa/array/threeSum.js

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
/**
2+
* 三数之和
3+
*/
4+
15
function threeEqualZero(nums, third, results) {
26
if (nums.length < 2) {
37
return;

src/dsa/array/twoSum.js

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
/**
2+
* 二数之和
3+
*/
4+
15
export function twoSum1(arr, target) {
26
if (typeof target !== 'number') {
37
throw new Error('target must be a number');

src/dsa/array/unique.js

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
/**
2+
* 数组去重
3+
*/
4+
15
// use object record item and filter
26
export const unique1 = arr => {
37
if (!Array.isArray(arr) || !arr.length) {

src/dsa/backTracking/backTracking.md

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
回溯算法
2+
3+
从解决问题每一步的所有可能选项里系统选择出一个可行的解决方案。
4+
在某一步选择一个选项后,进入下一步,然后面临新的选项。重复选择,直至达到最终状态。
5+
6+
回溯法解决的问题的所有选项可以用树状结构表示。
7+
8+
- 在某一步有n个可能的选项,该步骤可看作树中一个节点。
9+
- 节点每个选项看成节点连线,到达它的n个子节点。
10+
- 叶节点对应终结状态。
11+
- 叶节点满足约束条件,则为一个可行的解决方案。
12+
- 叶节点不满足约束条件,回溯到上一个节点,并尝试其他叶子节点。
13+
- 节点所有子节点均不满足条件,再回溯到上一个节点。
14+
- 所有状态均不能满足条件,问题无解。
15+
16+
![](https://user-gold-cdn.xitu.io/2019/8/20/16cac354abee3f00?imageView2/0/w/1280/h/960/format/webp/ignore-error/1)
File renamed without changes.

src/dsa/backTracking/solveNQueens.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export function solveNQueues() {}

src/dsa/backdateProgramming/getAllCombinEqualTarget.js

-26
This file was deleted.

src/dsa/bfs/bfs.js

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
/**
2+
* 广度优先算法
3+
* 广度优先算法是一种遍历或搜索树或图的方法,沿着树的宽度遍历树的节点。
4+
*/
15
export function BFSTraverseNR(rootNode, visitor) {
26
if (!rootNode || typeof visitor !== 'function') {
37
console.warn('rootNode is empty or visitor is not function');

src/dsa/bfs/bfs.test.js

+11
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,17 @@ describe('BFS', () => {
1919
results = [1, 2, 3, 4, 5, 6, 10];
2020
});
2121

22+
it('rootNode is empty or visitor is not function', () => {
23+
const nodes1 = [];
24+
BFSTraverseNR(null, node => {
25+
nodes1.push(node.name);
26+
});
27+
const nodes2 = [];
28+
BFSTraverseNR(root);
29+
expect(nodes1).toEqual([]);
30+
expect(nodes2).toEqual([]);
31+
});
32+
2233
it('breadth-first search non-recursion', () => {
2334
const nodes = [];
2435
BFSTraverseNR(root, node => {

src/dsa/dfs/dfs.js

+8
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
/**
2+
* 深度优先算法
3+
* 深度优先算法是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。
4+
*/
15
export function DFSTraverse(rootNode, visitor) {
26
if (!rootNode || typeof visitor !== 'function') {
37
console.warn('rootNode is empty or visitor is not function');
@@ -14,6 +18,10 @@ export function DFSTraverse(rootNode, visitor) {
1418
}
1519
}
1620

21+
/**
22+
* 深度优先非递归解法
23+
* 使用栈来解决
24+
*/
1725
export function DFSTraverseNR(rootNode, visitor) {
1826
if (!rootNode || typeof visitor !== 'function') {
1927
console.warn('rootNode is empty or visitor is not function');

src/dsa/dfs/dfs.test.js

+11
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,17 @@ describe('DFS', () => {
1919
results = [1, 2, 4, 5, 3, 6, 10];
2020
});
2121

22+
it('rootNode is empty or visitor is not function', () => {
23+
const nodes1 = [];
24+
DFSTraverse(null, node => {
25+
nodes1.push(node.name);
26+
});
27+
const nodes2 = [];
28+
DFSTraverseNR(root);
29+
expect(nodes1).toEqual([]);
30+
expect(nodes2).toEqual([]);
31+
});
32+
2233
it('depth-first search', () => {
2334
const nodes = [];
2435
DFSTraverse(root, node => {
+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/**
2+
* 双指针算法
3+
* 双指正算法主要是利用两个或多个不同位置的指针,通过速度和方向的变换解决问题。
4+
* 两个指针从不同位置出发:一个从始端开始,另一个从末端开始;
5+
* 两个指针以不同速度移动:一个指针快一些,另一个指针慢一些。
6+
*/

src/dsa/doublePointer/findKthToTail.js

+3
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,21 @@ export default function findKthToTail(head, k) {
66
return null;
77
}
88

9+
// 双指针
910
let first = head;
1011
let second = head;
1112
let index = 1;
1213

1314
while (first.next) {
1415
first = first.next;
16+
// 当 first 和 second 相距 k 时,second 开始逐渐前进
1517
if (index >= k) {
1618
second = second.next;
1719
}
1820
index++;
1921
}
2022

23+
// 循环结束后, k 如果大于 index 则说明倒数第 k 个节点不存在
2124
if (k > index) {
2225
return null;
2326
}

src/dsa/doublePointer/reOrderArray.js

+2
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ export function reOrderArray(arr) {
1616
let start = 0;
1717
let end = arr.length - 1;
1818
while (start < end) {
19+
// 碰到偶数 start 前进一位
1920
while (arr[start] % 2 === 1) {
2021
start++;
2122
}
23+
// 碰到奇数 end 前进一位
2224
while(arr[end] % 2 === 0) {
2325
end--;
2426
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
动态规划算法
2+
3+
动态规划背后的基本思想非常简单。
4+
大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),
5+
再根据子问题的解以得出原问题的解。
6+
7+
动态规划算法,需要分析出每个阶段的状态,从而分析出阶段之间的关系转化。
8+
适用于动态规划的问题,需要满足最优子结构和无后效性
9+
动态规划的求解过程,在于找到状态转移方程,进行自底向上的求解。
10+
11+
https://www.zhihu.com/question/23995189

src/dsa/dynamicProgramming/minEditDistance.js

+7
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
/**
2+
* matrix[i][j] = Math.min(
3+
* matrix[i - 1][j] + 1,
4+
* matrix[i][j - 1] + 1,
5+
* matrix[i - 1][j - 1] + (str1[i - 1] === str2[j - 1] ? 0 : 1)
6+
* );
7+
*/
18
export default function minEditDistance(str1, str2) {
29
if (!str1 || !str2) {
310
return Math.max(str1.length, str2.length);

0 commit comments

Comments
 (0)