Replace ``js with ``javascript

This commit is contained in:
krahets 2023-02-08 04:27:55 +08:00
parent 0407cc720c
commit 22b7d65d20
27 changed files with 127 additions and 92 deletions

4
.gitignore vendored
View file

@ -10,3 +10,7 @@ hello-algo.iml
.cache/
scripts/
docs/overrides/
# build
build/
site/

View file

@ -68,7 +68,7 @@ comments: true
=== "JavaScript"
```js title=""
```javascript title=""
/* 链表结点结构体 */
class ListNode {
val;
@ -225,7 +225,7 @@ comments: true
=== "JavaScript"
```js title="linked_list.js"
```javascript title="linked_list.js"
/* 初始化链表 1 -> 3 -> 2 -> 5 -> 4 */
// 初始化各个结点
const n0 = new ListNode(1);
@ -385,7 +385,7 @@ comments: true
=== "JavaScript"
```js title="linked_list.js"
```javascript title="linked_list.js"
/* 在链表的结点 n0 之后插入结点 P */
function insert(n0, P) {
let n1 = n0.next;
@ -537,7 +537,7 @@ comments: true
=== "JavaScript"
```js title="linked_list.js"
```javascript title="linked_list.js"
/* 访问链表中索引为 index 的结点 */
function access(head, index) {
for (let i = 0; i < index; i++) {
@ -660,7 +660,7 @@ comments: true
=== "JavaScript"
```js title="linked_list.js"
```javascript title="linked_list.js"
/* 在链表中查找值为 target 的首个结点 */
function find(head, target) {
let index = 0;
@ -815,7 +815,7 @@ comments: true
=== "JavaScript"
```js title=""
```javascript title=""
/* 双向链表结点类 */
class ListNode {
val;

View file

@ -56,7 +56,7 @@ comments: true
=== "JavaScript"
```js title="list.js"
```javascript title="list.js"
/* 初始化列表 */
// 无初始值
const list1 = [];
@ -154,7 +154,7 @@ comments: true
=== "JavaScript"
```js title="list.js"
```javascript title="list.js"
/* 访问元素 */
const num = list[1]; // 访问索引 1 处的元素
@ -292,7 +292,7 @@ comments: true
=== "JavaScript"
```js title="list.js"
```javascript title="list.js"
/* 清空列表 */
list.length = 0;
@ -462,7 +462,7 @@ comments: true
=== "JavaScript"
```js title="list.js"
```javascript title="list.js"
/* 通过索引遍历列表 */
let count = 0;
for (let i = 0; i < list.length; i++) {
@ -586,7 +586,7 @@ comments: true
=== "JavaScript"
```js title="list.js"
```javascript title="list.js"
/* 拼接两个列表 */
const list1 = [6, 8, 7, 10, 9];
list.push(...list1); // 将列表 list1 拼接到 list 之后
@ -664,7 +664,7 @@ comments: true
=== "JavaScript"
```js title="list.js"
```javascript title="list.js"
/* 排序列表 */
list.sort((a, b) => a - b); // 排序后,列表元素从小到大排列
```
@ -835,7 +835,7 @@ comments: true
=== "JavaScript"
```js title="my_list.js"
```javascript title="my_list.js"
/* 列表类简易实现 */
class MyList {
#nums = new Array(); // 数组(存储列表元素)

View file

@ -130,7 +130,7 @@ comments: true
=== "JavaScript"
```js title=""
```javascript title=""
/* 类 */
class Node {
val;
@ -309,7 +309,7 @@ comments: true
=== "JavaScript"
```js title=""
```javascript title=""
function algorithm(n) {
const a = 0; // O(1)
const b = new Array(10000); // O(1)
@ -455,7 +455,7 @@ comments: true
=== "JavaScript"
```js title=""
```javascript title=""
function constFunc() {
// do something
return 0;
@ -622,7 +622,7 @@ $$
=== "JavaScript"
```js title="space_complexity.js"
```javascript title="space_complexity.js"
/* 常数阶 */
function constant(n) {
// 常量、变量、对象占用 O(1) 空间
@ -785,7 +785,7 @@ $$
=== "JavaScript"
```js title="space_complexity.js"
```javascript title="space_complexity.js"
/* 线性阶 */
function linear(n) {
// 长度为 n 的数组占用 O(n) 空间
@ -928,7 +928,7 @@ $$
=== "JavaScript"
```js title="space_complexity.js"
```javascript title="space_complexity.js"
/* 线性阶(递归实现) */
function linearRecur(n) {
console.log(`递归 n = ${n}`);
@ -1031,7 +1031,7 @@ $$
=== "JavaScript"
```js title="space_complexity.js"
```javascript title="space_complexity.js"
/* 平方阶 */
function quadratic(n) {
// 矩阵占用 O(n^2) 空间
@ -1162,7 +1162,7 @@ $$
=== "JavaScript"
```js title="space_complexity.js"
```javascript title="space_complexity.js"
/* 平方阶(递归实现) */
function quadraticRecur(n) {
if (n <= 0) return 0;
@ -1272,7 +1272,7 @@ $$
=== "JavaScript"
```js title="space_complexity.js"
```javascript title="space_complexity.js"
/* 指数阶(建立满二叉树) */
function buildTree(n) {
if (n === 0) return null;

View file

@ -67,7 +67,7 @@ comments: true
=== "JavaScript"
```js title="leetcode_two_sum.js"
```javascript title="leetcode_two_sum.js"
function twoSumBruteForce(nums, target) {
const n = nums.length;
// 两层循环,时间复杂度 O(n^2)
@ -208,7 +208,7 @@ comments: true
=== "JavaScript"
```js title="leetcode_two_sum.js"
```javascript title="leetcode_two_sum.js"
function twoSumHashTable(nums, target) {
// 辅助哈希表,空间复杂度 O(n)
let m = {};

View file

@ -78,7 +78,7 @@ $$
=== "JavaScript"
```js title=""
```javascript title=""
// 在某运行平台下
function algorithm(n) {
var a = 2; // 1 ns
@ -252,7 +252,7 @@ $$
=== "JavaScript"
```js title=""
```javascript title=""
// 算法 A 时间复杂度:常数阶
function algorithm_A(n) {
console.log(0);
@ -445,7 +445,7 @@ $$
=== "JavaScript"
```js title=""
```javascript title=""
function algorithm(n){
var a = 1; // +1
a += 1; // +1
@ -646,7 +646,7 @@ $$
=== "JavaScript"
```js title=""
```javascript title=""
function algorithm(n) {
let a = 1; // +0技巧 1
a = a + n; // +0技巧 1
@ -826,7 +826,7 @@ $$
=== "JavaScript"
```js title="time_complexity.js"
```javascript title="time_complexity.js"
/* 常数阶 */
function constant(n) {
let count = 0;
@ -944,7 +944,7 @@ $$
=== "JavaScript"
```js title="time_complexity.js"
```javascript title="time_complexity.js"
/* 线性阶 */
function linear(n) {
let count = 0;
@ -1057,7 +1057,7 @@ $$
=== "JavaScript"
```js title="time_complexity.js"
```javascript title="time_complexity.js"
/* 线性阶(遍历数组) */
function arrayTraversal(nums) {
let count = 0;
@ -1181,7 +1181,7 @@ $$
=== "JavaScript"
```js title="time_complexity.js"
```javascript title="time_complexity.js"
/* 平方阶 */
function quadratic(n) {
let count = 0;
@ -1333,7 +1333,7 @@ $$
=== "JavaScript"
```js title="time_complexity.js"
```javascript title="time_complexity.js"
/* 平方阶(冒泡排序) */
function bubbleSort(nums) {
let count = 0; // 计数器
@ -1524,7 +1524,7 @@ $$
=== "JavaScript"
```js title="time_complexity.js"
```javascript title="time_complexity.js"
/* 指数阶(循环实现) */
function exponential(n) {
let count = 0,
@ -1679,7 +1679,7 @@ $$
=== "JavaScript"
```js title="time_complexity.js"
```javascript title="time_complexity.js"
/* 指数阶(递归实现) */
function expRecur(n) {
if (n == 1) return 1;
@ -1783,7 +1783,7 @@ $$
=== "JavaScript"
```js title="time_complexity.js"
```javascript title="time_complexity.js"
/* 对数阶(循环实现) */
function logarithmic(n) {
let count = 0;
@ -1909,7 +1909,7 @@ $$
=== "JavaScript"
```js title="time_complexity.js"
```javascript title="time_complexity.js"
/* 对数阶(递归实现) */
function logRecur(n) {
if (n <= 1) return 0;
@ -2014,7 +2014,7 @@ $$
=== "JavaScript"
```js title="time_complexity.js"
```javascript title="time_complexity.js"
/* 线性对数阶 */
function linearLogRecur(n) {
if (n <= 1) return 1;
@ -2156,7 +2156,7 @@ $$
=== "JavaScript"
```js title="time_complexity.js"
```javascript title="time_complexity.js"
/* 阶乘阶(递归实现) */
function factorialRecur(n) {
if (n == 0) return 1;
@ -2338,7 +2338,7 @@ $$
=== "JavaScript"
```js title="worst_best_time_complexity.js"
```javascript title="worst_best_time_complexity.js"
/* 生成一个数组,元素为 { 1, 2, ..., n },顺序被打乱 */
function randomNumbers(n) {
const nums = Array(n);

View file

@ -83,7 +83,7 @@ comments: true
=== "JavaScript"
```js title=""
```javascript title=""
/* JavaScript 的数组可以自由存储各种基本数据类型和对象 */
const array = [0, 0.0, 'a', false];
```

View file

@ -141,7 +141,7 @@ comments: true
=== "JavaScript"
```js title="graph_adjacency_matrix.js"
```javascript title="graph_adjacency_matrix.js"
```
@ -390,7 +390,7 @@ comments: true
=== "JavaScript"
```js title="graph_adjacency_list.js"
```javascript title="graph_adjacency_list.js"
```

View file

@ -131,7 +131,7 @@ comments: true
=== "JavaScript"
```js title="hash_map.js"
```javascript title="hash_map.js"
/* 初始化哈希表 */
const map = new ArrayHashMap();
/* 添加操作 */
@ -309,7 +309,7 @@ comments: true
=== "JavaScript"
```js title="hash_map.js"
```javascript title="hash_map.js"
/* 遍历哈希表 */
// 遍历键值对 key->value
for (const entry of map.entries()) {
@ -490,7 +490,7 @@ $$
=== "JavaScript"
```js title="array_hash_map.js"
```javascript title="array_hash_map.js"
/* 键值对 Number -> String */
class Entry {
constructor(key, val) {

View file

@ -207,7 +207,7 @@ comments: true
=== "JavaScript"
```js title="heap.js"
```javascript title="heap.js"
// JavaScript 未提供内置 heap 类
```
@ -329,7 +329,7 @@ comments: true
=== "JavaScript"
```js title="my_heap.js"
```javascript title="my_heap.js"
#maxHeap;
/* 构造函数,建立空堆或根据输入列表建堆 */
@ -465,7 +465,7 @@ comments: true
=== "JavaScript"
```js title="my_heap.js"
```javascript title="my_heap.js"
/* 访问堆顶元素 */
peek() {
return this.#maxHeap[0];
@ -586,7 +586,7 @@ comments: true
=== "JavaScript"
```js title="my_heap.js"
```javascript title="my_heap.js"
/* 元素入堆 */
push(val) {
// 添加结点
@ -794,7 +794,7 @@ comments: true
=== "JavaScript"
```js title="my_heap.js"
```javascript title="my_heap.js"
/* 元素出堆 */
poll() {
// 判空处理
@ -967,7 +967,7 @@ comments: true
=== "JavaScript"
```js title="my_heap.js"
```javascript title="my_heap.js"
/* 构造函数,建立空堆或根据输入列表建堆 */
constructor(nums) {
// 将列表元素原封不动添加进堆

View file

@ -142,7 +142,7 @@ comments: true
=== "JavaScript"
```js title=""
```javascript title=""
/* 标题注释,用于标注函数、类、测试样例等 */
// 内容注释,用于详解代码

View file

@ -94,7 +94,7 @@ $$
=== "JavaScript"
```js title="binary_search.js"
```javascript title="binary_search.js"
/* 二分查找(双闭区间) */
function binarySearch(nums, target) {
// 初始化双闭区间 [0, n-1] ,即 i, j 分别指向数组首元素、尾元素
@ -243,7 +243,7 @@ $$
=== "JavaScript"
```js title="binary_search.js"
```javascript title="binary_search.js"
/* 二分查找(左闭右开) */
function binarySearch1(nums, target) {
// 初始化左闭右开 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1
@ -400,7 +400,7 @@ $$
=== "JavaScript"
```js title=""
```javascript title=""
// (i + j) 有可能超出 int 的取值范围
let m = parseInt((i + j) / 2);
// 更换为此写法则不会越界

View file

@ -51,7 +51,7 @@ comments: true
=== "JavaScript"
```js title="hashing_search.js"
```javascript title="hashing_search.js"
/* 哈希查找(数组) */
function hashingSearchArray(map, target) {
// 哈希表的 key: 目标元素value: 索引
@ -145,7 +145,7 @@ comments: true
=== "JavaScript"
```js title="hashing_search.js"
```javascript title="hashing_search.js"
/* 哈希查找(链表) */
function hashingSearchLinkedList(map, target) {
// 哈希表的 key: 目标结点值value: 结点对象

View file

@ -49,7 +49,7 @@ comments: true
=== "JavaScript"
```js title="linear_search.js"
```javascript title="linear_search.js"
/* 线性查找(数组) */
function linearSearchArray(nums, target) {
// 遍历数组
@ -170,7 +170,7 @@ comments: true
=== "JavaScript"
```js title="linear_search.js"
```javascript title="linear_search.js"
/* 线性查找(链表)*/
function linearSearchLinkedList(head, target) {
// 遍历链表

View file

@ -85,7 +85,7 @@ comments: true
=== "JavaScript"
```js title="bubble_sort.js"
```javascript title="bubble_sort.js"
/* 冒泡排序 */
function bubbleSort(nums) {
// 外循环:待排序元素数量为 n-1, n-2, ..., 1
@ -256,7 +256,7 @@ comments: true
=== "JavaScript"
```js title="bubble_sort.js"
```javascript title="bubble_sort.js"
/* 冒泡排序(标志优化)*/
function bubbleSortWithFlag(nums) {
// 外循环:待排序元素数量为 n-1, n-2, ..., 1

View file

@ -63,7 +63,7 @@ comments: true
=== "JavaScript"
```js title="insertion_sort.js"
```javascript title="insertion_sort.js"
/* 插入排序 */
function insertionSort(nums) {
// 外循环base = nums[1], nums[2], ..., nums[n-1]

View file

@ -171,7 +171,7 @@ comments: true
=== "JavaScript"
```js title="merge_sort.js"
```javascript title="merge_sort.js"
/* 合并左子数组和右子数组 */
// 左子数组区间 [left, mid]
// 右子数组区间 [mid + 1, right]

View file

@ -287,7 +287,7 @@ comments: true
=== "JavaScript"
```js title="quick_sort.js"
```javascript title="quick_sort.js"
/* 快速排序 */
function quickSort(nums, left, right) {
// 子数组长度为 1 时终止递归
@ -444,7 +444,7 @@ comments: true
=== "JavaScript"
```js title="quick_sort.js"
```javascript title="quick_sort.js"
/* 选取三个元素的中位数 */
function medianThree(nums, left, mid, right) {
// 使用了异或操作来简化代码
@ -606,7 +606,7 @@ comments: true
=== "JavaScript"
```js title="quick_sort.js"
```javascript title="quick_sort.js"
/* 快速排序(尾递归优化) */
function quickSort(nums, left, right) {
// 子数组长度为 1 时终止

View file

@ -148,7 +148,7 @@ comments: true
=== "JavaScript"
```js title="deque.js"
```javascript title="deque.js"
/* 初始化双向队列 */
// JavaScript 没有内置的双端队列,只能把 Array 当作双端队列来使用
const deque = [];
@ -346,7 +346,7 @@ comments: true
=== "JavaScript"
```js title="linkedlist_deque.js"
```javascript title="linkedlist_deque.js"
/* 双向链表结点 */
class ListNode {
prev; // 前驱结点引用 (指针)

View file

@ -142,7 +142,7 @@ comments: true
=== "JavaScript"
```js title="queue.js"
```javascript title="queue.js"
/* 初始化队列 */
// JavaScript 没有内置的队列,可以把 Array 当作队列来使用
const queue = [];
@ -352,7 +352,7 @@ comments: true
=== "JavaScript"
```js title="linkedlist_queue.js"
```javascript title="linkedlist_queue.js"
/* 基于链表实现的队列 */
class LinkedListQueue {
#front; // 头结点 #front
@ -697,7 +697,7 @@ comments: true
=== "JavaScript"
```js title="array_queue.js"
```javascript title="array_queue.js"
/* 基于环形数组实现的队列 */
class ArrayQueue {
#nums; // 用于存储队列元素的数组

View file

@ -144,7 +144,7 @@ comments: true
=== "JavaScript"
```js title="stack.js"
```javascript title="stack.js"
/* 初始化栈 */
// Javascript 没有内置的栈类,可以把 Array 当作栈来使用
const stack = [];
@ -355,7 +355,7 @@ comments: true
=== "JavaScript"
```js title="linkedlist_stack.js"
```javascript title="linkedlist_stack.js"
/* 基于链表实现的栈 */
class LinkedListStack {
#stackPeek; // 将头结点作为栈顶
@ -671,7 +671,7 @@ comments: true
=== "JavaScript"
```js title="array_stack.js"
```javascript title="array_stack.js"
/* 基于数组实现的栈 */
class ArrayStack {
stack;

View file

@ -79,7 +79,7 @@ G. M. Adelson-Velsky 和 E. M. Landis 在其 1962 年发表的论文 "An algorit
=== "JavaScript"
```js title=""
```javascript title=""
class TreeNode {
val; // 结点值
height; //结点高度
@ -214,7 +214,7 @@ G. M. Adelson-Velsky 和 E. M. Landis 在其 1962 年发表的论文 "An algorit
=== "JavaScript"
```js title="avl_tree.js"
```javascript title="avl_tree.js"
/* 获取结点高度 */
height(node) {
// 空结点高度为 -1 ,叶结点高度为 0
@ -328,7 +328,7 @@ G. M. Adelson-Velsky 和 E. M. Landis 在其 1962 年发表的论文 "An algorit
=== "JavaScript"
```js title="avl_tree.js"
```javascript title="avl_tree.js"
/* 获取平衡因子 */
balanceFactor(node) {
// 空结点平衡因子为 0
@ -459,7 +459,7 @@ AVL 树的独特之处在于「旋转 Rotation」的操作其可 **在不影
=== "JavaScript"
```js title="avl_tree.js"
```javascript title="avl_tree.js"
/* 右旋操作 */
rightRotate(node) {
const child = node.left;
@ -592,7 +592,7 @@ AVL 树的独特之处在于「旋转 Rotation」的操作其可 **在不影
=== "JavaScript"
```js title="avl_tree.js"
```javascript title="avl_tree.js"
/* 左旋操作 */
leftRotate(node) {
const child = node.right;
@ -766,7 +766,7 @@ AVL 树的独特之处在于「旋转 Rotation」的操作其可 **在不影
=== "JavaScript"
```js title="avl_tree.js"
```javascript title="avl_tree.js"
/* 执行旋转操作,使该子树重新恢复平衡 */
rotate(node) {
// 获取结点 node 的平衡因子
@ -1003,7 +1003,7 @@ AVL 树的独特之处在于「旋转 Rotation」的操作其可 **在不影
=== "JavaScript"
```js title="avl_tree.js"
```javascript title="avl_tree.js"
/* 插入结点 */
insert(val) {
this.root = this.insertHelper(this.root, val);
@ -1245,7 +1245,7 @@ AVL 树的独特之处在于「旋转 Rotation」的操作其可 **在不影
=== "JavaScript"
```js title="avl_tree.js"
```javascript title="avl_tree.js"
/* 删除结点 */
remove(val) {
this.root = this.removeHelper(this.root, val);

View file

@ -79,7 +79,7 @@ comments: true
=== "JavaScript"
```js title="binary_search_tree.js"
```javascript title="binary_search_tree.js"
/* 查找结点 */
function search(num) {
let cur = root;
@ -244,7 +244,7 @@ comments: true
=== "JavaScript"
```js title="binary_search_tree.js"
```javascript title="binary_search_tree.js"
/* 插入结点 */
function insert(num) {
// 若树为空,直接提前返回
@ -517,7 +517,7 @@ comments: true
=== "JavaScript"
```js title="binary_search_tree.js"
```javascript title="binary_search_tree.js"
/* 删除结点 */
function remove(num) {
// 若树为空,直接提前返回

View file

@ -62,7 +62,7 @@ comments: true
=== "JavaScript"
```js title=""
```javascript title=""
/* 链表结点类 */
function TreeNode(val, left, right) {
this.val = (val === undefined ? 0 : val); // 结点值
@ -229,7 +229,7 @@ comments: true
=== "JavaScript"
```js title="binary_tree.js"
```javascript title="binary_tree.js"
/* 初始化二叉树 */
// 初始化结点
let n1 = new TreeNode(1),
@ -361,7 +361,7 @@ comments: true
=== "JavaScript"
```js title="binary_tree.js"
```javascript title="binary_tree.js"
/* 插入与删除结点 */
let P = new TreeNode(0);
// 在 n1 -> n2 中间插入结点 P
@ -527,7 +527,7 @@ comments: true
=== "JavaScript"
```js title=""
```javascript title=""
/* 二叉树的数组表示 */
// 直接使用 null 来表示空位
let tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];

View file

@ -66,7 +66,7 @@ comments: true
=== "JavaScript"
```js title="binary_tree_bfs.js"
```javascript title="binary_tree_bfs.js"
/* 层序遍历 */
function hierOrder(root) {
// 初始化队列,加入根结点
@ -257,7 +257,7 @@ comments: true
=== "JavaScript"
```js title="binary_tree_dfs.js"
```javascript title="binary_tree_dfs.js"
/* 前序遍历 */
function preOrder(root){
if (root === null) return;

View file

@ -13,6 +13,7 @@ import shutil
from docs.utils.extract_code_python import ExtractCodeBlocksPython
from docs.utils.extract_code_java import ExtractCodeBlocksJava
from docs.utils.extract_code_cpp import ExtractCodeBlocksCpp
from docs.utils.extract_code_jsts import ExtractCodeBlocksJSTS
def build_markdown(md_path):
@ -85,6 +86,8 @@ extractor_dict = {
"java": ExtractCodeBlocksJava(),
"python": ExtractCodeBlocksPython(),
"cpp": ExtractCodeBlocksCpp(),
"javascript": ExtractCodeBlocksJSTS(),
"typescript": ExtractCodeBlocksJSTS(),
}

View file

@ -0,0 +1,28 @@
"""
File: extract_code_python.py
Created Time: 2023-02-07
Author: Krahets (krahets@163.com)
"""
import re
import glob
import sys, os.path as osp
sys.path.append(osp.dirname(osp.dirname(osp.dirname(osp.abspath(__file__)))))
from docs.utils.extract_code_java import ExtractCodeBlocksJava
class ExtractCodeBlocksJSTS(ExtractCodeBlocksJava):
def __init__(self) -> None:
super().__init__()
# Pattern to match function names and class names
self.func_pattern = r'\s*(function|private|public|)\s*(\S*)\(.*\)(:|)\s*(\S*)\s*{\s*\n'
self.class_pattern = r'class\s+(\w+)\s*\{'
self.func_pattern_keys = ["total", "prefix", "label", ":", "return"]
self.class_pattern_keys = ["total", "label"]
# for code_path in glob.glob("codes/cpp/chapter_*/my_heap.cpp"):
# ext = ExtractCodeBlocksCpp()
# ext.extract(code_path)