From fcbaf101a416bb6616c49a0581d2fc36b7f17f14 Mon Sep 17 00:00:00 2001 From: Yudong Jin Date: Tue, 14 Nov 2023 21:27:35 +0800 Subject: [PATCH] Several bug fixes and improvements (#945) * Update Dockerfile for code debugging. * Format Python code using Black. * Improve dark theme by defining html classes for the figures, animations and cover images. * Fix several glossary translation. * Update a code comment. * Fix climbing_stairs_backtrack: the pruning should not require the sorted choices list. * Update the code of array and list traversal. * Fix a rendering issue of README.md * Update code of list traversal. * Fix array_definition.png * Update README.md * Fix max_capacity_moving_short_board.png * Fix array.dart * Fix array.dart * Fix array.dart * Fix array.dart --- README.md | 11 +-- codes/Dockerfile | 2 +- codes/c/chapter_array_and_linkedlist/array.c | 2 +- .../climbing_stairs_backtrack.c | 2 +- .../chapter_array_and_linkedlist/array.cpp | 2 +- .../cpp/chapter_array_and_linkedlist/list.cpp | 11 ++- .../climbing_stairs_backtrack.cpp | 2 +- .../chapter_array_and_linkedlist/array.cs | 6 +- .../chapter_array_and_linkedlist/list.cs | 7 +- .../climbing_stairs_backtrack.cs | 2 +- .../chapter_array_and_linkedlist/array.dart | 30 ++++---- .../chapter_array_and_linkedlist/list.dart | 6 +- .../climbing_stairs_backtrack.dart | 2 +- codes/docker-compose.yml | 2 +- .../go/chapter_array_and_linkedlist/array.go | 13 +++- .../chapter_array_and_linkedlist/list_test.go | 7 +- .../climbing_stairs_backtrack.go | 2 +- .../chapter_array_and_linkedlist/array.java | 6 +- .../chapter_array_and_linkedlist/list.java | 12 ++- .../climbing_stairs_backtrack.java | 2 +- .../chapter_array_and_linkedlist/array.js | 6 +- .../chapter_array_and_linkedlist/list.js | 7 +- .../climbing_stairs_backtrack.js | 2 +- .../chapter_array_and_linkedlist/array.py | 9 ++- .../chapter_array_and_linkedlist/list.py | 13 ++-- .../climbing_stairs_backtrack.py | 2 +- codes/python/modules/print_util.py | 4 +- .../chapter_array_and_linkedlist/array.rs | 10 +-- .../rust/chapter_array_and_linkedlist/list.rs | 34 ++++----- .../climbing_stairs_backtrack.rs | 2 +- .../chapter_array_and_linkedlist/array.swift | 10 +-- .../chapter_array_and_linkedlist/list.swift | 9 +-- .../climbing_stairs_backtrack.swift | 2 +- .../chapter_array_and_linkedlist/array.ts | 6 +- .../chapter_array_and_linkedlist/list.ts | 7 +- .../climbing_stairs_backtrack.ts | 2 +- .../chapter_array_and_linkedlist/array.zig | 8 +- .../zig/chapter_array_and_linkedlist/list.zig | 7 +- .../climbing_stairs_backtrack.zig | 2 +- docs/chapter_appendix/index.md | 2 +- docs/chapter_appendix/terminology.md | 12 +-- .../array.assets/array_definition.png | Bin 21031 -> 21103 bytes docs/chapter_array_and_linkedlist/index.md | 6 +- docs/chapter_array_and_linkedlist/list.md | 72 +++++++++--------- docs/chapter_array_and_linkedlist/summary.md | 2 +- docs/chapter_backtracking/index.md | 2 +- .../chapter_computational_complexity/index.md | 2 +- docs/chapter_data_structure/index.md | 2 +- .../chapter_data_structure/number_encoding.md | 6 +- docs/chapter_divide_and_conquer/index.md | 2 +- docs/chapter_dynamic_programming/index.md | 2 +- docs/chapter_graph/index.md | 2 +- docs/chapter_greedy/index.md | 2 +- .../max_capacity_moving_short_board.png | Bin 18716 -> 18851 bytes docs/chapter_hashing/index.md | 2 +- docs/chapter_heap/index.md | 2 +- docs/chapter_introduction/index.md | 2 +- docs/chapter_preface/index.md | 2 +- docs/chapter_searching/index.md | 2 +- docs/chapter_sorting/index.md | 2 +- docs/chapter_stack_and_queue/index.md | 2 +- docs/chapter_tree/index.md | 2 +- docs/index.md | 4 +- overrides/stylesheets/extra.css | 25 ++++-- 64 files changed, 212 insertions(+), 218 deletions(-) diff --git a/README.md b/README.md index 600ab6518..40b1d915e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@

- - +

@@ -12,11 +11,9 @@

- - + - - +

@@ -66,7 +63,7 @@ - [内容修正](https://www.hello-algo.com/chapter_appendix/contribution/):请您协助修正或在评论区指出语法错误、内容缺失、文字歧义、无效链接或代码 bug 等问题。 - [代码转译](https://github.com/krahets/hello-algo/issues/15):期待您贡献各种语言代码,已支持 Python、Java、C++、Go、JavaScript 等 12 门编程语言。 -- [整书翻译](https://github.com/krahets/hello-algo/tree/en):诚邀您加入我们的中译英小组,成员主要来自计算机相关专业、英语专业和英文母语者。 +- [Chinese-to-English](https://github.com/krahets/hello-algo/tree/en):诚邀您加入我们的翻译小组,成员主要来自计算机相关专业、英语专业和英文母语者。 欢迎您提出宝贵意见和建议,如有任何问题请提交 Issues 或微信联系 `krahets-jyd` 。 diff --git a/codes/Dockerfile b/codes/Dockerfile index 1e4a57523..310d91cb7 100644 --- a/codes/Dockerfile +++ b/codes/Dockerfile @@ -10,7 +10,7 @@ RUN apt-get update && apt-get install -y wget # Install languages environment ARG LANGS RUN for LANG in $LANGS; do \ - case "$LANG" in \ + case $LANG in \ python) \ apt-get install -y python3.10 && \ update-alternatives --install /usr/bin/python python /usr/bin/python3.10 1 ;; \ diff --git a/codes/c/chapter_array_and_linkedlist/array.c b/codes/c/chapter_array_and_linkedlist/array.c index 11f6fa0b1..217d0cb0c 100644 --- a/codes/c/chapter_array_and_linkedlist/array.c +++ b/codes/c/chapter_array_and_linkedlist/array.c @@ -55,7 +55,7 @@ void traverse(int *nums, int size) { int count = 0; // 通过索引遍历数组 for (int i = 0; i < size; i++) { - count++; + count += nums[i]; } } diff --git a/codes/c/chapter_dynamic_programming/climbing_stairs_backtrack.c b/codes/c/chapter_dynamic_programming/climbing_stairs_backtrack.c index 7106cd267..5e5b3eba2 100644 --- a/codes/c/chapter_dynamic_programming/climbing_stairs_backtrack.c +++ b/codes/c/chapter_dynamic_programming/climbing_stairs_backtrack.c @@ -16,7 +16,7 @@ void backtrack(int *choices, int state, int n, int *res, int len) { int choice = choices[i]; // 剪枝:不允许越过第 n 阶 if (state + choice > n) - break; + continue; // 尝试:做出选择,更新状态 backtrack(choices, state + choice, n, res, len); // 回退 diff --git a/codes/cpp/chapter_array_and_linkedlist/array.cpp b/codes/cpp/chapter_array_and_linkedlist/array.cpp index c3ba85705..e3507840d 100644 --- a/codes/cpp/chapter_array_and_linkedlist/array.cpp +++ b/codes/cpp/chapter_array_and_linkedlist/array.cpp @@ -52,7 +52,7 @@ void traverse(int *nums, int size) { int count = 0; // 通过索引遍历数组 for (int i = 0; i < size; i++) { - count++; + count += nums[i]; } } diff --git a/codes/cpp/chapter_array_and_linkedlist/list.cpp b/codes/cpp/chapter_array_and_linkedlist/list.cpp index 558d08e11..cd10c0ca1 100644 --- a/codes/cpp/chapter_array_and_linkedlist/list.cpp +++ b/codes/cpp/chapter_array_and_linkedlist/list.cpp @@ -14,8 +14,8 @@ int main() { printVector(nums); /* 访问元素 */ - int x = nums[1]; - cout << "访问索引 1 处的元素,得到 x = " << x << endl; + int num = nums[1]; + cout << "访问索引 1 处的元素,得到 num = " << num << endl; /* 更新元素 */ nums[1] = 0; @@ -49,13 +49,12 @@ int main() { /* 通过索引遍历列表 */ int count = 0; for (int i = 0; i < nums.size(); i++) { - count++; + count += nums[i]; } - /* 直接遍历列表元素 */ count = 0; - for (int n : nums) { - count++; + for (int x : nums) { + count += x; } /* 拼接两个列表 */ diff --git a/codes/cpp/chapter_dynamic_programming/climbing_stairs_backtrack.cpp b/codes/cpp/chapter_dynamic_programming/climbing_stairs_backtrack.cpp index 167065109..7e7e352b1 100644 --- a/codes/cpp/chapter_dynamic_programming/climbing_stairs_backtrack.cpp +++ b/codes/cpp/chapter_dynamic_programming/climbing_stairs_backtrack.cpp @@ -16,7 +16,7 @@ void backtrack(vector &choices, int state, int n, vector &res) { for (auto &choice : choices) { // 剪枝:不允许越过第 n 阶 if (state + choice > n) - break; + continue; // 尝试:做出选择,更新状态 backtrack(choices, state + choice, n, res); // 回退 diff --git a/codes/csharp/chapter_array_and_linkedlist/array.cs b/codes/csharp/chapter_array_and_linkedlist/array.cs index fe5f60e73..dfab3a051 100644 --- a/codes/csharp/chapter_array_and_linkedlist/array.cs +++ b/codes/csharp/chapter_array_and_linkedlist/array.cs @@ -50,11 +50,11 @@ public class array { int count = 0; // 通过索引遍历数组 for (int i = 0; i < nums.Length; i++) { - count++; + count += nums[i]; } - // 直接遍历数组 + // 直接遍历数组元素 foreach (int num in nums) { - count++; + count += num; } } diff --git a/codes/csharp/chapter_array_and_linkedlist/list.cs b/codes/csharp/chapter_array_and_linkedlist/list.cs index 4dea8a70b..72f3687bb 100644 --- a/codes/csharp/chapter_array_and_linkedlist/list.cs +++ b/codes/csharp/chapter_array_and_linkedlist/list.cs @@ -46,13 +46,12 @@ public class list { /* 通过索引遍历列表 */ int count = 0; for (int i = 0; i < nums.Count; i++) { - count++; + count += nums[i]; } - /* 直接遍历列表元素 */ count = 0; - foreach (int n in nums) { - count++; + foreach (int x in nums) { + count += x; } /* 拼接两个列表 */ diff --git a/codes/csharp/chapter_dynamic_programming/climbing_stairs_backtrack.cs b/codes/csharp/chapter_dynamic_programming/climbing_stairs_backtrack.cs index a4ae85706..3cbae9688 100644 --- a/codes/csharp/chapter_dynamic_programming/climbing_stairs_backtrack.cs +++ b/codes/csharp/chapter_dynamic_programming/climbing_stairs_backtrack.cs @@ -16,7 +16,7 @@ public class climbing_stairs_backtrack { foreach (int choice in choices) { // 剪枝:不允许越过第 n 阶 if (state + choice > n) - break; + continue; // 尝试:做出选择,更新状态 Backtrack(choices, state + choice, n, res); // 回退 diff --git a/codes/dart/chapter_array_and_linkedlist/array.dart b/codes/dart/chapter_array_and_linkedlist/array.dart index 9309d64f4..2e4fc4b00 100644 --- a/codes/dart/chapter_array_and_linkedlist/array.dart +++ b/codes/dart/chapter_array_and_linkedlist/array.dart @@ -9,7 +9,7 @@ import 'dart:math'; /* 随机访问元素 */ -int randomAccess(List nums) { +int randomAccess(List nums) { // 在区间 [0, nums.length) 中随机抽取一个数字 int randomIndex = Random().nextInt(nums.length); // 获取并返回随机元素 @@ -18,7 +18,7 @@ int randomAccess(List nums) { } /* 扩展数组长度 */ -List extend(List nums, int enlarge) { +List extend(List nums, int enlarge) { // 初始化一个扩展长度后的数组 List res = List.filled(nums.length + enlarge, 0); // 将原数组中的所有元素复制到新数组 @@ -30,7 +30,7 @@ List extend(List nums, int enlarge) { } /* 在数组的索引 index 处插入元素 num */ -void insert(List nums, int num, int index) { +void insert(List nums, int num, int index) { // 把索引 index 以及之后的所有元素向后移动一位 for (var i = nums.length - 1; i > index; i--) { nums[i] = nums[i - 1]; @@ -40,7 +40,7 @@ void insert(List nums, int num, int index) { } /* 删除索引 index 处元素 */ -void remove(List nums, int index) { +void remove(List nums, int index) { // 把索引 index 之后的所有元素向前移动一位 for (var i = index; i < nums.length - 1; i++) { nums[i] = nums[i + 1]; @@ -48,24 +48,24 @@ void remove(List nums, int index) { } /* 遍历数组元素 */ -void traverse(List nums) { - var count = 0; +void traverse(List nums) { + int count = 0; // 通过索引遍历数组 for (var i = 0; i < nums.length; i++) { - count++; + count += nums[i]; } - // 直接遍历数组 - for (var num in nums) { - count++; + // 直接遍历数组元素 + for (int num in nums) { + count += num; } // 通过 forEach 方法遍历数组 - nums.forEach((element) { - count++; + nums.forEach((num) { + count += num; }); } /* 在数组中查找指定元素 */ -int find(List nums, int target) { +int find(List nums, int target) { for (var i = 0; i < nums.length; i++) { if (nums[i] == target) return i; } @@ -77,7 +77,7 @@ void main() { /* 初始化数组 */ var arr = List.filled(5, 0); print('数组 arr = $arr'); - List nums = [1, 3, 2, 5, 4]; + List nums = [1, 3, 2, 5, 4]; print('数组 nums = $nums'); /* 随机访问 */ @@ -96,7 +96,7 @@ void main() { remove(nums, 2); print("删除索引 2 处的元素,得到 nums = $nums"); - /* 遍历元素 */ + /* 遍历数组 */ traverse(nums); /* 查找元素 */ diff --git a/codes/dart/chapter_array_and_linkedlist/list.dart b/codes/dart/chapter_array_and_linkedlist/list.dart index f0b2e83cf..784cf37f6 100644 --- a/codes/dart/chapter_array_and_linkedlist/list.dart +++ b/codes/dart/chapter_array_and_linkedlist/list.dart @@ -43,12 +43,12 @@ void main() { /* 通过索引遍历列表 */ int count = 0; for (var i = 0; i < nums.length; i++) { - count++; + count += nums[i]; } /* 直接遍历列表元素 */ count = 0; - for (var n in nums) { - count++; + for (var x in nums) { + count += x; } /* 拼接两个列表 */ diff --git a/codes/dart/chapter_dynamic_programming/climbing_stairs_backtrack.dart b/codes/dart/chapter_dynamic_programming/climbing_stairs_backtrack.dart index 5bae93d38..3300fbd49 100644 --- a/codes/dart/chapter_dynamic_programming/climbing_stairs_backtrack.dart +++ b/codes/dart/chapter_dynamic_programming/climbing_stairs_backtrack.dart @@ -13,7 +13,7 @@ void backtrack(List choices, int state, int n, List res) { // 遍历所有选择 for (int choice in choices) { // 剪枝:不允许越过第 n 阶 - if (state + choice > n) break; + if (state + choice > n) continue; // 尝试:做出选择,更新状态 backtrack(choices, state + choice, n, res); // 回退 diff --git a/codes/docker-compose.yml b/codes/docker-compose.yml index e003ab034..7c11b7c5b 100644 --- a/codes/docker-compose.yml +++ b/codes/docker-compose.yml @@ -6,7 +6,7 @@ services: args: # 设置需要安装的语言,使用空格隔开 # Set the languages to be installed, separated by spaces - LANGS: "python cpp csharp" + LANGS: "python cpp java csharp" image: hello-algo-code container_name: hello-algo-code stdin_open: true diff --git a/codes/go/chapter_array_and_linkedlist/array.go b/codes/go/chapter_array_and_linkedlist/array.go index 114281854..792dab618 100644 --- a/codes/go/chapter_array_and_linkedlist/array.go +++ b/codes/go/chapter_array_and_linkedlist/array.go @@ -52,12 +52,17 @@ func traverse(nums []int) { count := 0 // 通过索引遍历数组 for i := 0; i < len(nums); i++ { - count++ + count += nums[i] } count = 0 - // 直接遍历数组 - for range nums { - count++ + // 直接遍历数组元素 + for _, num := range nums { + count += num + } + // 同时遍历数据索引和元素 + for i, num := range nums { + count += nums[i] + count += num } } diff --git a/codes/go/chapter_array_and_linkedlist/list_test.go b/codes/go/chapter_array_and_linkedlist/list_test.go index ce83a2db4..b07a41eea 100644 --- a/codes/go/chapter_array_and_linkedlist/list_test.go +++ b/codes/go/chapter_array_and_linkedlist/list_test.go @@ -47,13 +47,12 @@ func TestList(t *testing.T) { /* 通过索引遍历列表 */ count := 0 for i := 0; i < len(nums); i++ { - count++ + count += nums[i] } - /* 直接遍历列表元素 */ count = 0 - for range nums { - count++ + for _, x := range nums { + count += x } /* 拼接两个列表 */ diff --git a/codes/go/chapter_dynamic_programming/climbing_stairs_backtrack.go b/codes/go/chapter_dynamic_programming/climbing_stairs_backtrack.go index 8049775d5..b77a07b77 100644 --- a/codes/go/chapter_dynamic_programming/climbing_stairs_backtrack.go +++ b/codes/go/chapter_dynamic_programming/climbing_stairs_backtrack.go @@ -14,7 +14,7 @@ func backtrack(choices []int, state, n int, res []int) { for _, choice := range choices { // 剪枝:不允许越过第 n 阶 if state+choice > n { - break + continue } // 尝试:做出选择,更新状态 backtrack(choices, state+choice, n, res) diff --git a/codes/java/chapter_array_and_linkedlist/array.java b/codes/java/chapter_array_and_linkedlist/array.java index 0e330e46a..c0f73d039 100644 --- a/codes/java/chapter_array_and_linkedlist/array.java +++ b/codes/java/chapter_array_and_linkedlist/array.java @@ -54,11 +54,11 @@ public class array { int count = 0; // 通过索引遍历数组 for (int i = 0; i < nums.length; i++) { - count++; + count += nums[i]; } - // 直接遍历数组 + // 直接遍历数组元素 for (int num : nums) { - count++; + count += num; } } diff --git a/codes/java/chapter_array_and_linkedlist/list.java b/codes/java/chapter_array_and_linkedlist/list.java index 0a22ed06d..1c8dd7d7f 100644 --- a/codes/java/chapter_array_and_linkedlist/list.java +++ b/codes/java/chapter_array_and_linkedlist/list.java @@ -17,8 +17,8 @@ public class list { System.out.println("列表 nums = " + nums); /* 访问元素 */ - int x = nums.get(1); - System.out.println("访问索引 1 处的元素,得到 x = " + x); + int num = nums.get(1); + System.out.println("访问索引 1 处的元素,得到 num = " + num); /* 更新元素 */ nums.set(1, 0); @@ -47,13 +47,11 @@ public class list { /* 通过索引遍历列表 */ int count = 0; for (int i = 0; i < nums.size(); i++) { - count++; + count += nums.get(i); } - /* 直接遍历列表元素 */ - count = 0; - for (int num : nums) { - count++; + for (int x : nums) { + count += x; } /* 拼接两个列表 */ diff --git a/codes/java/chapter_dynamic_programming/climbing_stairs_backtrack.java b/codes/java/chapter_dynamic_programming/climbing_stairs_backtrack.java index fa302e25e..6e30b2726 100644 --- a/codes/java/chapter_dynamic_programming/climbing_stairs_backtrack.java +++ b/codes/java/chapter_dynamic_programming/climbing_stairs_backtrack.java @@ -18,7 +18,7 @@ public class climbing_stairs_backtrack { for (Integer choice : choices) { // 剪枝:不允许越过第 n 阶 if (state + choice > n) - break; + continue; // 尝试:做出选择,更新状态 backtrack(choices, state + choice, n, res); // 回退 diff --git a/codes/javascript/chapter_array_and_linkedlist/array.js b/codes/javascript/chapter_array_and_linkedlist/array.js index a6ce0b53e..4fdbab4c8 100644 --- a/codes/javascript/chapter_array_and_linkedlist/array.js +++ b/codes/javascript/chapter_array_and_linkedlist/array.js @@ -50,11 +50,11 @@ function traverse(nums) { let count = 0; // 通过索引遍历数组 for (let i = 0; i < nums.length; i++) { - count++; + count += nums[i]; } - // 直接遍历数组 + // 直接遍历数组元素 for (const num of nums) { - count += 1; + count += num; } } diff --git a/codes/javascript/chapter_array_and_linkedlist/list.js b/codes/javascript/chapter_array_and_linkedlist/list.js index e627a4277..281132eba 100644 --- a/codes/javascript/chapter_array_and_linkedlist/list.js +++ b/codes/javascript/chapter_array_and_linkedlist/list.js @@ -39,13 +39,12 @@ console.log(`删除索引 3 处的元素,得到 nums = ${nums}`); /* 通过索引遍历列表 */ let count = 0; for (let i = 0; i < nums.length; i++) { - count++; + count += nums[i]; } - /* 直接遍历列表元素 */ count = 0; -for (const n of nums) { - count++; +for (const x of nums) { + count += x; } /* 拼接两个列表 */ diff --git a/codes/javascript/chapter_dynamic_programming/climbing_stairs_backtrack.js b/codes/javascript/chapter_dynamic_programming/climbing_stairs_backtrack.js index 90eef731e..21e6699d8 100644 --- a/codes/javascript/chapter_dynamic_programming/climbing_stairs_backtrack.js +++ b/codes/javascript/chapter_dynamic_programming/climbing_stairs_backtrack.js @@ -11,7 +11,7 @@ function backtrack(choices, state, n, res) { // 遍历所有选择 for (const choice of choices) { // 剪枝:不允许越过第 n 阶 - if (state + choice > n) break; + if (state + choice > n) continue; // 尝试:做出选择,更新状态 backtrack(choices, state + choice, n, res); // 回退 diff --git a/codes/python/chapter_array_and_linkedlist/array.py b/codes/python/chapter_array_and_linkedlist/array.py index 0b917e76d..a6b9c76c0 100644 --- a/codes/python/chapter_array_and_linkedlist/array.py +++ b/codes/python/chapter_array_and_linkedlist/array.py @@ -50,13 +50,14 @@ def traverse(nums: list[int]): count = 0 # 通过索引遍历数组 for i in range(len(nums)): - count += 1 - # 直接遍历数组 + count += nums[i] + # 直接遍历数组元素 for num in nums: - count += 1 + count += num # 同时遍历数据索引和元素 for i, num in enumerate(nums): - count += 1 + count += nums[i] + count += num def find(nums: list[int], target: int) -> int: diff --git a/codes/python/chapter_array_and_linkedlist/list.py b/codes/python/chapter_array_and_linkedlist/list.py index b9ad6d352..b2da5c194 100644 --- a/codes/python/chapter_array_and_linkedlist/list.py +++ b/codes/python/chapter_array_and_linkedlist/list.py @@ -38,16 +38,13 @@ if __name__ == "__main__": nums.pop(3) print("\n删除索引 3 处的元素,得到 nums =", nums) - # 遍历列表 - tmp = [] + # 通过索引遍历列表 + count = 0 for i in range(len(nums)): - tmp.append(nums[i]) - print(f"\n通过索引遍历列表得到 tmp = {tmp}") - - tmp.clear() + count += nums[i] + # 直接遍历列表元素 for num in nums: - tmp.append(num) - print(f"\n直接遍历列表元素得到 tmp = {tmp}") + count += num # 拼接两个列表 nums1 = [6, 8, 7, 10, 9] diff --git a/codes/python/chapter_dynamic_programming/climbing_stairs_backtrack.py b/codes/python/chapter_dynamic_programming/climbing_stairs_backtrack.py index 962df8514..5b43e741a 100644 --- a/codes/python/chapter_dynamic_programming/climbing_stairs_backtrack.py +++ b/codes/python/chapter_dynamic_programming/climbing_stairs_backtrack.py @@ -14,7 +14,7 @@ def backtrack(choices: list[int], state: int, n: int, res: list[int]) -> int: for choice in choices: # 剪枝:不允许越过第 n 阶 if state + choice > n: - break + continue # 尝试:做出选择,更新状态 backtrack(choices, state + choice, n, res) # 回退 diff --git a/codes/python/modules/print_util.py b/codes/python/modules/print_util.py index b210db3c6..4780009bc 100644 --- a/codes/python/modules/print_util.py +++ b/codes/python/modules/print_util.py @@ -35,7 +35,9 @@ def show_trunks(p: Trunk | None): print(p.str, end="") -def print_tree(root: TreeNode | None, prev: Trunk | None = None, is_right: bool = False): +def print_tree( + root: TreeNode | None, prev: Trunk | None = None, is_right: bool = False +): """ Print a binary tree This tree printer is borrowed from TECHIE DELIGHT diff --git a/codes/rust/chapter_array_and_linkedlist/array.rs b/codes/rust/chapter_array_and_linkedlist/array.rs index 3670ec58a..76f0f3f52 100644 --- a/codes/rust/chapter_array_and_linkedlist/array.rs +++ b/codes/rust/chapter_array_and_linkedlist/array.rs @@ -51,12 +51,12 @@ fn remove(nums: &mut Vec, index: usize) { fn traverse(nums: &[i32]) { let mut _count = 0; // 通过索引遍历数组 - for _ in 0..nums.len() { - _count += 1; + for i in 0..nums.len() { + _count += nums[i]; } - // 直接遍历数组 - for _ in nums { - _count += 1; + // 直接遍历数组元素 + for num in nums { + _count += num; } } diff --git a/codes/rust/chapter_array_and_linkedlist/list.rs b/codes/rust/chapter_array_and_linkedlist/list.rs index 241c71094..e1f384777 100644 --- a/codes/rust/chapter_array_and_linkedlist/list.rs +++ b/codes/rust/chapter_array_and_linkedlist/list.rs @@ -8,26 +8,26 @@ include!("../include/include.rs"); /* Driver Code */ fn main() { - // 初始化列表 + // 初始化列表 let mut nums: Vec = vec![ 1, 3, 2, 5, 4 ]; print!("列表 nums = "); print_util::print_array(&nums); - // 访问元素 + // 访问元素 let num = nums[1]; println!("\n访问索引 1 处的元素,得到 num = {num}"); - // 更新元素 + // 更新元素 nums[1] = 0; print!("将索引 1 处的元素更新为 0 ,得到 nums = "); print_util::print_array(&nums); - // 清空列表 + // 清空列表 nums.clear(); print!("\n清空列表后 nums = "); print_util::print_array(&nums); - // 尾部添加元素 + // 尾部添加元素 nums.push(1); nums.push(3); nums.push(2); @@ -36,39 +36,35 @@ fn main() { print!("\n添加元素后 nums = "); print_util::print_array(&nums); - // 中间插入元素 + // 中间插入元素 nums.insert(3, 6); print!("\n在索引 3 处插入数字 6 ,得到 nums = "); print_util::print_array(&nums); - // 删除元素 + // 删除元素 nums.remove(3); print!("\n删除索引 3 处的元素,得到 nums = "); print_util::print_array(&nums); - // 通过索引遍历列表 + // 通过索引遍历列表 let mut _count = 0; - for _ in 0..nums.len() { - _count += 1; + for i in 0..nums.len() { + _count += nums[i]; } - // 直接遍历列表元素 _count = 0; - for _n in &nums { - _count += 1; - } - // 或者 - // nums.iter().for_each(|_| _count += 1); - // let _count = nums.iter().fold(0, |_count, _| _count + 1); + for x in &nums { + _count += x; + } - // 拼接两个列表 + // 拼接两个列表 let mut nums1 = vec![ 6, 8, 7, 10, 9 ]; nums.append(&mut nums1); // append(移动) 之后 nums1 为空! // nums.extend(&nums1); // extend(借用) nums1 能继续使用 print!("\n将列表 nums1 拼接到 nums 之后,得到 nums = "); print_util::print_array(&nums); - // 排序列表 + // 排序列表 nums.sort(); print!("\n排序列表后 nums = "); print_util::print_array(&nums); diff --git a/codes/rust/chapter_dynamic_programming/climbing_stairs_backtrack.rs b/codes/rust/chapter_dynamic_programming/climbing_stairs_backtrack.rs index 1e9443491..726d516c2 100644 --- a/codes/rust/chapter_dynamic_programming/climbing_stairs_backtrack.rs +++ b/codes/rust/chapter_dynamic_programming/climbing_stairs_backtrack.rs @@ -11,7 +11,7 @@ fn backtrack(choices: &[i32], state: i32, n: i32, res: &mut [i32]) { // 遍历所有选择 for &choice in choices { // 剪枝:不允许越过第 n 阶 - if state + choice > n { break; } + if state + choice > n { continue; } // 尝试:做出选择,更新状态 backtrack(choices, state + choice, n, res); // 回退 diff --git a/codes/swift/chapter_array_and_linkedlist/array.swift b/codes/swift/chapter_array_and_linkedlist/array.swift index 61f95e959..0bbdeab5a 100644 --- a/codes/swift/chapter_array_and_linkedlist/array.swift +++ b/codes/swift/chapter_array_and_linkedlist/array.swift @@ -48,12 +48,12 @@ func remove(nums: inout [Int], index: Int) { func traverse(nums: [Int]) { var count = 0 // 通过索引遍历数组 - for _ in nums.indices { - count += 1 + for i in nums.indices { + count += nums[i] } - // 直接遍历数组 - for _ in nums { - count += 1 + // 直接遍历数组元素 + for num in nums { + count += num } } diff --git a/codes/swift/chapter_array_and_linkedlist/list.swift b/codes/swift/chapter_array_and_linkedlist/list.swift index 269cbce12..4d64f5578 100644 --- a/codes/swift/chapter_array_and_linkedlist/list.swift +++ b/codes/swift/chapter_array_and_linkedlist/list.swift @@ -42,14 +42,13 @@ enum List { /* 通过索引遍历列表 */ var count = 0 - for _ in nums.indices { - count += 1 + for i in nums.indices { + count += nums[i] } - /* 直接遍历列表元素 */ count = 0 - for _ in nums { - count += 1 + for x in nums { + count += x } /* 拼接两个列表 */ diff --git a/codes/swift/chapter_dynamic_programming/climbing_stairs_backtrack.swift b/codes/swift/chapter_dynamic_programming/climbing_stairs_backtrack.swift index 69469972e..2fcd71ee7 100644 --- a/codes/swift/chapter_dynamic_programming/climbing_stairs_backtrack.swift +++ b/codes/swift/chapter_dynamic_programming/climbing_stairs_backtrack.swift @@ -14,7 +14,7 @@ func backtrack(choices: [Int], state: Int, n: Int, res: inout [Int]) { for choice in choices { // 剪枝:不允许越过第 n 阶 if state + choice > n { - break + continue } backtrack(choices: choices, state: state + choice, n: n, res: &res) } diff --git a/codes/typescript/chapter_array_and_linkedlist/array.ts b/codes/typescript/chapter_array_and_linkedlist/array.ts index eb5475e36..79f854fdd 100644 --- a/codes/typescript/chapter_array_and_linkedlist/array.ts +++ b/codes/typescript/chapter_array_and_linkedlist/array.ts @@ -50,11 +50,11 @@ function traverse(nums: number[]): void { let count = 0; // 通过索引遍历数组 for (let i = 0; i < nums.length; i++) { - count++; + count += nums[i]; } - // 直接遍历数组 + // 直接遍历数组元素 for (const num of nums) { - count += 1; + count += num; } } diff --git a/codes/typescript/chapter_array_and_linkedlist/list.ts b/codes/typescript/chapter_array_and_linkedlist/list.ts index 93fbbb32b..af6bdb328 100644 --- a/codes/typescript/chapter_array_and_linkedlist/list.ts +++ b/codes/typescript/chapter_array_and_linkedlist/list.ts @@ -39,13 +39,12 @@ console.log(`删除索引 3 处的元素,得到 nums = ${nums}`); /* 通过索引遍历列表 */ let count = 0; for (let i = 0; i < nums.length; i++) { - count++; + count += nums[i]; } - /* 直接遍历列表元素 */ count = 0; -for (const n of nums) { - count++; +for (const x of nums) { + count += x; } /* 拼接两个列表 */ diff --git a/codes/typescript/chapter_dynamic_programming/climbing_stairs_backtrack.ts b/codes/typescript/chapter_dynamic_programming/climbing_stairs_backtrack.ts index 2e49885c7..ee370f298 100644 --- a/codes/typescript/chapter_dynamic_programming/climbing_stairs_backtrack.ts +++ b/codes/typescript/chapter_dynamic_programming/climbing_stairs_backtrack.ts @@ -16,7 +16,7 @@ function backtrack( // 遍历所有选择 for (const choice of choices) { // 剪枝:不允许越过第 n 阶 - if (state + choice > n) break; + if (state + choice > n) continue; // 尝试:做出选择,更新状态 backtrack(choices, state + choice, n, res); // 回退 diff --git a/codes/zig/chapter_array_and_linkedlist/array.zig b/codes/zig/chapter_array_and_linkedlist/array.zig index c13e72d55..b2814ed58 100644 --- a/codes/zig/chapter_array_and_linkedlist/array.zig +++ b/codes/zig/chapter_array_and_linkedlist/array.zig @@ -51,12 +51,12 @@ pub fn traverse(nums: []i32) void { // 通过索引遍历数组 var i: i32 = 0; while (i < nums.len) : (i += 1) { - count += 1; + count += nums[i]; } count = 0; - // 直接遍历数组 - for (nums) |_| { - count += 1; + // 直接遍历数组元素 + for (nums) |num| { + count += num; } } diff --git a/codes/zig/chapter_array_and_linkedlist/list.zig b/codes/zig/chapter_array_and_linkedlist/list.zig index 9c81da4c4..db8d7e664 100644 --- a/codes/zig/chapter_array_and_linkedlist/list.zig +++ b/codes/zig/chapter_array_and_linkedlist/list.zig @@ -52,13 +52,12 @@ pub fn main() !void { var count: i32 = 0; var i: i32 = 0; while (i < nums.items.len) : (i += 1) { - count += 1; + count += nums[i]; } - // 直接遍历列表元素 count = 0; - for (nums.items) |_| { - count += 1; + for (nums.items) |x| { + count += x; } // 拼接两个列表 diff --git a/codes/zig/chapter_dynamic_programming/climbing_stairs_backtrack.zig b/codes/zig/chapter_dynamic_programming/climbing_stairs_backtrack.zig index b5adbbfbb..356ae2750 100644 --- a/codes/zig/chapter_dynamic_programming/climbing_stairs_backtrack.zig +++ b/codes/zig/chapter_dynamic_programming/climbing_stairs_backtrack.zig @@ -14,7 +14,7 @@ fn backtrack(choices: []i32, state: i32, n: i32, res: std.ArrayList(i32)) void { for (choices) |choice| { // 剪枝:不允许越过第 n 阶 if (state + choice > n) { - break; + continue; } // 尝试:做出选择,更新状态 backtrack(choices, state + choice, n, res); diff --git a/docs/chapter_appendix/index.md b/docs/chapter_appendix/index.md index 8f71d7503..55f077ee3 100644 --- a/docs/chapter_appendix/index.md +++ b/docs/chapter_appendix/index.md @@ -2,6 +2,6 @@

-![附录](../assets/covers/chapter_appendix.jpg){ width="600" } +![附录](../assets/covers/chapter_appendix.jpg)
diff --git a/docs/chapter_appendix/terminology.md b/docs/chapter_appendix/terminology.md index 80e6efa95..1da75fccc 100644 --- a/docs/chapter_appendix/terminology.md +++ b/docs/chapter_appendix/terminology.md @@ -17,13 +17,13 @@ | 递归树 | recursion tree | | 大 $O$ 记号 | big-$O$ notation | | 渐近上界 | asymptotic upper bound | -| 原码 | true form | -| 反码 | 1's complement code | -| 补码 | 2's complement code | +| 原码 | sign–magnitude | +| 反码 | 1's complement | +| 补码 | 2's complement | | 数组 | array | | 索引 | index | | 链表 | linked list | -| 链表节点 | linked list node, list node | +| 链表节点 | linked list node, list node | | 列表 | list | | 动态数组 | dynamic array | | 栈 | stack | @@ -56,8 +56,8 @@ | 完全二叉树 | complete binary tree | | 完满二叉树 | full binary tree | | 平衡二叉树 | balanced binary tree | -| AVL 树 | AVL tree | -| 红黑树 | red-black tree | +| AVL 树 | AVL tree | +| 红黑树 | red-black tree | | 层序遍历 | level-order traversal | | 广度优先遍历 | breadth-first traversal | | 深度优先遍历 | depth-first traversal | diff --git a/docs/chapter_array_and_linkedlist/array.assets/array_definition.png b/docs/chapter_array_and_linkedlist/array.assets/array_definition.png index 57700f27d22bdc5feaad66c4b5047bf0fe44c062..ca996b71fe5218cc5532e815397633c30fdcdb24 100644 GIT binary patch literal 21103 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 C2kHd? literal 21031 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 jLYC&m#p1t`-chbKy!*%n{F8f)}#W&U%FS(aA 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 diff --git a/docs/chapter_array_and_linkedlist/index.md b/docs/chapter_array_and_linkedlist/index.md index 872380c12..c6fe52800 100644 --- a/docs/chapter_array_and_linkedlist/index.md +++ b/docs/chapter_array_and_linkedlist/index.md @@ -1,10 +1,6 @@ # 数组与链表 -
- -![数组与链表](../assets/covers/chapter_array_and_linkedlist.jpg){ width="600" } - -
+![数组与链表](../assets/covers/chapter_array_and_linkedlist.jpg) !!! abstract diff --git a/docs/chapter_array_and_linkedlist/list.md b/docs/chapter_array_and_linkedlist/list.md index cdf7cdaa5..77c48d5af 100755 --- a/docs/chapter_array_and_linkedlist/list.md +++ b/docs/chapter_array_and_linkedlist/list.md @@ -494,12 +494,11 @@ # 通过索引遍历列表 count = 0 for i in range(len(nums)): - count += 1 + count += nums[i] # 直接遍历列表元素 - count = 0 for num in nums: - count += 1 + count += num ``` === "C++" @@ -508,13 +507,13 @@ /* 通过索引遍历列表 */ int count = 0; for (int i = 0; i < nums.size(); i++) { - count++; + count += nums[i]; } /* 直接遍历列表元素 */ count = 0; for (int num : nums) { - count++; + count += num; } ``` @@ -524,13 +523,12 @@ /* 通过索引遍历列表 */ int count = 0; for (int i = 0; i < nums.size(); i++) { - count++; + count += nums.get(i); } /* 直接遍历列表元素 */ - count = 0; for (int num : nums) { - count++; + count += num; } ``` @@ -540,13 +538,13 @@ /* 通过索引遍历列表 */ int count = 0; for (int i = 0; i < nums.Count; i++) { - count++; + count += nums[i]; } /* 直接遍历列表元素 */ count = 0; foreach (int num in nums) { - count++; + count += num; } ``` @@ -556,13 +554,13 @@ /* 通过索引遍历列表 */ count := 0 for i := 0; i < len(nums); i++ { - count++ + count += nums[i] } /* 直接遍历列表元素 */ count = 0 - for range nums { - count++ + for _, num := range nums { + count += num } ``` @@ -571,14 +569,14 @@ ```swift title="list.swift" /* 通过索引遍历列表 */ var count = 0 - for _ in nums.indices { - count += 1 + for i in nums.indices { + count += nums[i] } /* 直接遍历列表元素 */ count = 0 - for _ in nums { - count += 1 + for num in nums { + count += num } ``` @@ -588,13 +586,13 @@ /* 通过索引遍历列表 */ let count = 0; for (let i = 0; i < nums.length; i++) { - count++; + count += nums[i]; } /* 直接遍历列表元素 */ count = 0; for (const num of nums) { - count++; + count += num; } ``` @@ -604,13 +602,13 @@ /* 通过索引遍历列表 */ let count = 0; for (let i = 0; i < nums.length; i++) { - count++; + count += nums[i]; } /* 直接遍历列表元素 */ count = 0; for (const num of nums) { - count++; + count += num; } ``` @@ -619,30 +617,30 @@ ```dart title="list.dart" /* 通过索引遍历列表 */ int count = 0; - for (int i = 0; i < nums.length; i++) { - count++; + for (var i = 0; i < nums.length; i++) { + count += nums[i]; } - + /* 直接遍历列表元素 */ count = 0; - for (int num in nums) { - count++; + for (var num in nums) { + count += num; } ``` === "Rust" ```rust title="list.rs" - /* 通过索引遍历列表 */ - let mut count = 0; - for (index, value) in nums.iter().enumerate() { - count += 1; + // 通过索引遍历列表 + let mut _count = 0; + for i in 0..nums.len() { + _count += nums[i]; } - /* 直接遍历列表元素 */ - let mut count = 0; - for value in nums.iter() { - count += 1; + // 直接遍历列表元素 + _count = 0; + for num in &nums { + _count += num; } ``` @@ -659,13 +657,13 @@ var count: i32 = 0; var i: i32 = 0; while (i < nums.items.len) : (i += 1) { - count += 1; + count += nums[i]; } // 直接遍历列表元素 count = 0; - for (nums.items) |_| { - count += 1; + for (nums.items) |num| { + count += num; } ``` diff --git a/docs/chapter_array_and_linkedlist/summary.md b/docs/chapter_array_and_linkedlist/summary.md index 8927a6f6a..38033cc3c 100644 --- a/docs/chapter_array_and_linkedlist/summary.md +++ b/docs/chapter_array_and_linkedlist/summary.md @@ -33,7 +33,7 @@ 不修改 `P.next` 也可以。从该链表的角度看,从头节点遍历到尾节点已经遇不到 `P` 了。这意味着节点 `P` 已经从链表中删除了,此时节点 `P` 指向哪里都不会对这条链表产生影响了。 - 从垃圾回收的角度看,对于 Java、Python、Go 等拥有自动垃圾回收的语言来说,节点 `P` 是否被回收取决于是否有仍存在指向它的引用,而不是 `P.next` 的值。在 C 和 C++ 等语言中,我们需要手动释放节点内存。 + 从垃圾回收的角度看,对于 Java、Python、Go 等拥有自动垃圾回收的语言来说,节点 `P` 是否被回收取决于是否仍存在指向它的引用,而不是 `P.next` 的值。在 C 和 C++ 等语言中,我们需要手动释放节点内存。 !!! question "在链表中插入和删除操作的时间复杂度是 $O(1)$ 。但是增删之前都需要 $O(n)$ 查找元素,那为什么时间复杂度不是 $O(n)$ 呢?" diff --git a/docs/chapter_backtracking/index.md b/docs/chapter_backtracking/index.md index 9d5845eee..cfaaba97c 100644 --- a/docs/chapter_backtracking/index.md +++ b/docs/chapter_backtracking/index.md @@ -2,7 +2,7 @@
-![回溯](../assets/covers/chapter_backtracking.jpg){ width="600" } +![回溯](../assets/covers/chapter_backtracking.jpg)
diff --git a/docs/chapter_computational_complexity/index.md b/docs/chapter_computational_complexity/index.md index 5867040c5..7a3294d68 100644 --- a/docs/chapter_computational_complexity/index.md +++ b/docs/chapter_computational_complexity/index.md @@ -2,7 +2,7 @@
-![复杂度分析](../assets/covers/chapter_complexity_analysis.jpg){ width="600" } +![复杂度分析](../assets/covers/chapter_complexity_analysis.jpg)
diff --git a/docs/chapter_data_structure/index.md b/docs/chapter_data_structure/index.md index 2cfc9bcfe..14ef0c17f 100644 --- a/docs/chapter_data_structure/index.md +++ b/docs/chapter_data_structure/index.md @@ -2,7 +2,7 @@
-![数据结构](../assets/covers/chapter_data_structure.jpg){ width="600" } +![数据结构](../assets/covers/chapter_data_structure.jpg)
diff --git a/docs/chapter_data_structure/number_encoding.md b/docs/chapter_data_structure/number_encoding.md index d04c2b56d..94903af74 100644 --- a/docs/chapter_data_structure/number_encoding.md +++ b/docs/chapter_data_structure/number_encoding.md @@ -18,7 +18,7 @@ ![原码、反码与补码之间的相互转换](number_encoding.assets/1s_2s_complement.png) -「原码 true form」虽然最直观,但存在一些局限性。一方面,**负数的原码不能直接用于运算**。例如在原码下计算 $1 + (-2)$ ,得到的结果是 $-3$ ,这显然是不对的。 +「原码 sign–magnitude」虽然最直观,但存在一些局限性。一方面,**负数的原码不能直接用于运算**。例如在原码下计算 $1 + (-2)$ ,得到的结果是 $-3$ ,这显然是不对的。 $$ \begin{aligned} @@ -29,7 +29,7 @@ $$ \end{aligned} $$ -为了解决此问题,计算机引入了「反码 1's complement code」。如果我们先将原码转换为反码,并在反码下计算 $1 + (-2)$ ,最后将结果从反码转化回原码,则可得到正确结果 $-1$ 。 +为了解决此问题,计算机引入了「反码 1's complement」。如果我们先将原码转换为反码,并在反码下计算 $1 + (-2)$ ,最后将结果从反码转化回原码,则可得到正确结果 $-1$ 。 $$ \begin{aligned} @@ -51,7 +51,7 @@ $$ \end{aligned} $$ -与原码一样,反码也存在正负零歧义问题,因此计算机进一步引入了「补码 2's complement code」。我们先来观察一下负零的原码、反码、补码的转换过程: +与原码一样,反码也存在正负零歧义问题,因此计算机进一步引入了「补码 2's complement」。我们先来观察一下负零的原码、反码、补码的转换过程: $$ \begin{aligned} diff --git a/docs/chapter_divide_and_conquer/index.md b/docs/chapter_divide_and_conquer/index.md index 4f7f0ca6d..1d828f090 100644 --- a/docs/chapter_divide_and_conquer/index.md +++ b/docs/chapter_divide_and_conquer/index.md @@ -2,7 +2,7 @@
-![分治](../assets/covers/chapter_divide_and_conquer.jpg){ width="600" } +![分治](../assets/covers/chapter_divide_and_conquer.jpg)
diff --git a/docs/chapter_dynamic_programming/index.md b/docs/chapter_dynamic_programming/index.md index c8a09a7af..b27ede90c 100644 --- a/docs/chapter_dynamic_programming/index.md +++ b/docs/chapter_dynamic_programming/index.md @@ -2,7 +2,7 @@
-![动态规划](../assets/covers/chapter_dynamic_programming.jpg){ width="600" } +![动态规划](../assets/covers/chapter_dynamic_programming.jpg)
diff --git a/docs/chapter_graph/index.md b/docs/chapter_graph/index.md index 511e6e2ad..d3e7cb9fa 100644 --- a/docs/chapter_graph/index.md +++ b/docs/chapter_graph/index.md @@ -2,7 +2,7 @@
-![图](../assets/covers/chapter_graph.jpg){ width="600" } +![图](../assets/covers/chapter_graph.jpg)
diff --git a/docs/chapter_greedy/index.md b/docs/chapter_greedy/index.md index b2f4f3d85..ea86650e8 100644 --- a/docs/chapter_greedy/index.md +++ b/docs/chapter_greedy/index.md @@ -2,7 +2,7 @@
-![贪心](../assets/covers/chapter_greedy.jpg){ width="600" } +![贪心](../assets/covers/chapter_greedy.jpg)
diff --git a/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_moving_short_board.png b/docs/chapter_greedy/max_capacity_problem.assets/max_capacity_moving_short_board.png index 7c08655ca2d78899522dcbd6fb5b2ed5f879a4d9..01b44bea746f0a89f1bf144138891d3116aac29c 100644 GIT binary patch literal 18851 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
7rw_fP&LdNTn-&ALMP?M*HA;^-)oM!D=Jgwh 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 literal 18716 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 diff --git a/docs/chapter_hashing/index.md b/docs/chapter_hashing/index.md index dd2235ebd..b7568bbad 100644 --- a/docs/chapter_hashing/index.md +++ b/docs/chapter_hashing/index.md @@ -2,7 +2,7 @@
-![哈希表](../assets/covers/chapter_hashing.jpg){ width="600" } +![哈希表](../assets/covers/chapter_hashing.jpg)
diff --git a/docs/chapter_heap/index.md b/docs/chapter_heap/index.md index 12fccd3fb..c5065ee1b 100644 --- a/docs/chapter_heap/index.md +++ b/docs/chapter_heap/index.md @@ -2,7 +2,7 @@
-![堆](../assets/covers/chapter_heap.jpg){ width="600" } +![堆](../assets/covers/chapter_heap.jpg)
diff --git a/docs/chapter_introduction/index.md b/docs/chapter_introduction/index.md index 510fcd05f..d2d770e7a 100644 --- a/docs/chapter_introduction/index.md +++ b/docs/chapter_introduction/index.md @@ -2,7 +2,7 @@
-![初识算法](../assets/covers/chapter_introduction.jpg){ width="600" } +![初识算法](../assets/covers/chapter_introduction.jpg)
diff --git a/docs/chapter_preface/index.md b/docs/chapter_preface/index.md index 4307e17fd..aac7d4444 100644 --- a/docs/chapter_preface/index.md +++ b/docs/chapter_preface/index.md @@ -2,7 +2,7 @@
-![前言](../assets/covers/chapter_preface.jpg){ width="600" } +![前言](../assets/covers/chapter_preface.jpg)
diff --git a/docs/chapter_searching/index.md b/docs/chapter_searching/index.md index 4939f1c55..8619d00c5 100644 --- a/docs/chapter_searching/index.md +++ b/docs/chapter_searching/index.md @@ -2,7 +2,7 @@
-![搜索](../assets/covers/chapter_searching.jpg){ width="600" } +![搜索](../assets/covers/chapter_searching.jpg)
diff --git a/docs/chapter_sorting/index.md b/docs/chapter_sorting/index.md index fb753b1e3..11d083256 100644 --- a/docs/chapter_sorting/index.md +++ b/docs/chapter_sorting/index.md @@ -2,7 +2,7 @@
-![排序](../assets/covers/chapter_sorting.jpg){ width="600" } +![排序](../assets/covers/chapter_sorting.jpg)
diff --git a/docs/chapter_stack_and_queue/index.md b/docs/chapter_stack_and_queue/index.md index e49dbba54..f3a7a936c 100644 --- a/docs/chapter_stack_and_queue/index.md +++ b/docs/chapter_stack_and_queue/index.md @@ -2,7 +2,7 @@
-![栈与队列](../assets/covers/chapter_stack_and_queue.jpg){ width="600" } +![栈与队列](../assets/covers/chapter_stack_and_queue.jpg)
diff --git a/docs/chapter_tree/index.md b/docs/chapter_tree/index.md index d1cdebded..74ffce97b 100644 --- a/docs/chapter_tree/index.md +++ b/docs/chapter_tree/index.md @@ -2,7 +2,7 @@
-![树](../assets/covers/chapter_tree.jpg){ width="600" } +![树](../assets/covers/chapter_tree.jpg)
diff --git a/docs/index.md b/docs/index.md index c78f830a9..c5d77e9bc 100644 --- a/docs/index.md +++ b/docs/index.md @@ -8,8 +8,8 @@ hide:

- - + +

《 Hello 算法 》

diff --git a/overrides/stylesheets/extra.css b/overrides/stylesheets/extra.css index 0db2dc4ff..e7a289b66 100644 --- a/overrides/stylesheets/extra.css +++ b/overrides/stylesheets/extra.css @@ -25,7 +25,7 @@ --md-default-fg-color: #adbac7; --md-default-bg-color: #22272e; - --md-code-bg-color: #1D2126; + --md-code-bg-color: #1d2126; --md-code-fg-color: #adbac7; --md-accent-fg-color: #aaa; @@ -43,6 +43,23 @@ color: var(--md-default-fg-color) !important; } +/* Figure class */ +.animation-figure { + border-radius: 0.63rem; + display: block; + margin: 0 auto; +} + +/* Cover image class */ +.cover-image { + width: 28rem; + height: auto; + border-radius: 0.3rem; + box-shadow: var(--md-shadow-z2); + display: block; + margin: 0 auto; +} + /* Center Markdown Tables (requires md_in_html extension) */ .center-table { text-align: center; @@ -82,12 +99,6 @@ text-transform: none; } -/* Image align center */ -.center { - display: block; - margin: 0 auto; -} - /* font-family setting for Win10 */ body { --md-text-font-family: -apple-system, BlinkMacSystemFont,