feat: Traditional Chinese version (#1163)

* First commit

* Update mkdocs.yml

* Translate all the docs to traditional Chinese

* Translate the code files.

* Translate the docker file

* Fix mkdocs.yml

* Translate all the figures from SC to TC

* 二叉搜尋樹 -> 二元搜尋樹

* Update terminology.

* Update terminology

* 构造函数/构造方法 -> 建構子
异或 -> 互斥或

* 擴充套件 -> 擴展

* constant - 常量 - 常數

* 類	-> 類別

* AVL -> AVL 樹

* 數組 -> 陣列

* 係統 -> 系統
斐波那契數列 -> 費波那契數列
運算元量 -> 運算量
引數 -> 參數

* 聯絡 -> 關聯

* 麵試 -> 面試

* 面向物件 -> 物件導向
歸併排序 -> 合併排序
范式 -> 範式

* Fix 算法 -> 演算法

* 錶示 -> 表示
反碼 -> 一補數
補碼 -> 二補數
列列尾部 -> 佇列尾部
區域性性 -> 區域性
一摞 -> 一疊

* Synchronize with main branch

* 賬號 -> 帳號
推匯 -> 推導

* Sync with main branch

* First commit

* Update mkdocs.yml

* Translate all the docs to traditional Chinese

* Translate the code files.

* Translate the docker file

* Fix mkdocs.yml

* Translate all the figures from SC to TC

* 二叉搜尋樹 -> 二元搜尋樹

* Update terminology

* 构造函数/构造方法 -> 建構子
异或 -> 互斥或

* 擴充套件 -> 擴展

* constant - 常量 - 常數

* 類	-> 類別

* AVL -> AVL 樹

* 數組 -> 陣列

* 係統 -> 系統
斐波那契數列 -> 費波那契數列
運算元量 -> 運算量
引數 -> 參數

* 聯絡 -> 關聯

* 麵試 -> 面試

* 面向物件 -> 物件導向
歸併排序 -> 合併排序
范式 -> 範式

* Fix 算法 -> 演算法

* 錶示 -> 表示
反碼 -> 一補數
補碼 -> 二補數
列列尾部 -> 佇列尾部
區域性性 -> 區域性
一摞 -> 一疊

* Synchronize with main branch

* 賬號 -> 帳號
推匯 -> 推導

* Sync with main branch

* Update terminology.md

* 操作数量(num. of operations)-> 操作數量

* 字首和->前綴和

* Update figures

* 歸 -> 迴
記憶體洩漏 -> 記憶體流失

* Fix the bug of the file filter

* 支援 -> 支持
Add zh-Hant/README.md

* Add the zh-Hant chapter covers.
Bug fixes.

* 外掛 -> 擴充功能

* Add the landing page for zh-Hant version

* Unify the font of the chapter covers for the zh, en, and zh-Hant version

* Move zh-Hant/ to zh-hant/

* Translate terminology.md to traditional Chinese
This commit is contained in:
Yudong Jin
2024-04-06 02:30:11 +08:00
committed by GitHub
parent 33d7f8a2e5
commit 5f7385c8a3
1875 changed files with 102923 additions and 18 deletions
@@ -0,0 +1,34 @@
// File: binary_search_recur.go
// Created Time: 2023-07-19
// Author: hongyun-robot (1836017030@qq.com)
package chapter_divide_and_conquer
/* 二分搜尋:問題 f(i, j) */
func dfs(nums []int, target, i, j int) int {
// 如果區間為空,代表沒有目標元素,則返回 -1
if i > j {
return -1
}
// 計算索引中點
m := i + ((j - i) >> 1)
//判斷中點與目標元素大小
if nums[m] < target {
// 小於則遞迴右半陣列
// 遞迴子問題 f(m+1, j)
return dfs(nums, target, m+1, j)
} else if nums[m] > target {
// 小於則遞迴左半陣列
// 遞迴子問題 f(i, m-1)
return dfs(nums, target, i, m-1)
} else {
// 找到目標元素,返回其索引
return m
}
}
/* 二分搜尋 */
func binarySearch(nums []int, target int) int {
n := len(nums)
return dfs(nums, target, 0, n-1)
}
@@ -0,0 +1,20 @@
// File: binary_search_recur_test.go
// Created Time: 2023-07-19
// Author: hongyun-robot (1836017030@qq.com)
package chapter_divide_and_conquer
import (
"fmt"
"testing"
)
func TestBinarySearch(t *testing.T) {
nums := []int{1, 3, 6, 8, 12, 15, 23, 26, 31, 35}
target := 6
noTarget := 99
targetIndex := binarySearch(nums, target)
fmt.Println("目標元素 6 的索引 = ", targetIndex)
noTargetIndex := binarySearch(nums, noTarget)
fmt.Println("不存在目標元素的索引 = ", noTargetIndex)
}
@@ -0,0 +1,37 @@
// File: build_tree.go
// Created Time: 2023-07-20
// Author: hongyun-robot (1836017030@qq.com)
package chapter_divide_and_conquer
import . "github.com/krahets/hello-algo/pkg"
/* 構建二元樹:分治 */
func dfsBuildTree(preorder []int, inorderMap map[int]int, i, l, r int) *TreeNode {
// 子樹區間為空時終止
if r-l < 0 {
return nil
}
// 初始化根節點
root := NewTreeNode(preorder[i])
// 查詢 m ,從而劃分左右子樹
m := inorderMap[preorder[i]]
// 子問題:構建左子樹
root.Left = dfsBuildTree(preorder, inorderMap, i+1, l, m-1)
// 子問題:構建右子樹
root.Right = dfsBuildTree(preorder, inorderMap, i+1+m-l, m+1, r)
// 返回根節點
return root
}
/* 構建二元樹 */
func buildTree(preorder, inorder []int) *TreeNode {
// 初始化雜湊表,儲存 inorder 元素到索引的對映
inorderMap := make(map[int]int, len(inorder))
for i := 0; i < len(inorder); i++ {
inorderMap[inorder[i]] = i
}
root := dfsBuildTree(preorder, inorderMap, 0, 0, len(inorder)-1)
return root
}
@@ -0,0 +1,25 @@
// File: build_tree_test.go
// Created Time: 2023-07-20
// Author: hongyun-robot (1836017030@qq.com)
package chapter_divide_and_conquer
import (
"fmt"
"testing"
. "github.com/krahets/hello-algo/pkg"
)
func TestBuildTree(t *testing.T) {
preorder := []int{3, 9, 2, 1, 7}
inorder := []int{9, 3, 1, 2, 7}
fmt.Print("前序走訪 = ")
PrintSlice(preorder)
fmt.Print("中序走訪 = ")
PrintSlice(inorder)
root := buildTree(preorder, inorder)
fmt.Println("構建的二元樹為:")
PrintTree(root)
}
@@ -0,0 +1,39 @@
// File: hanota.go
// Created Time: 2023-07-21
// Author: hongyun-robot (1836017030@qq.com)
package chapter_divide_and_conquer
import "container/list"
/* 移動一個圓盤 */
func move(src, tar *list.List) {
// 從 src 頂部拿出一個圓盤
pan := src.Back()
// 將圓盤放入 tar 頂部
tar.PushBack(pan.Value)
// 移除 src 頂部圓盤
src.Remove(pan)
}
/* 求解河內塔問題 f(i) */
func dfsHanota(i int, src, buf, tar *list.List) {
// 若 src 只剩下一個圓盤,則直接將其移到 tar
if i == 1 {
move(src, tar)
return
}
// 子問題 f(i-1) :將 src 頂部 i-1 個圓盤藉助 tar 移到 buf
dfsHanota(i-1, src, tar, buf)
// 子問題 f(1) :將 src 剩餘一個圓盤移到 tar
move(src, tar)
// 子問題 f(i-1) :將 buf 頂部 i-1 個圓盤藉助 src 移到 tar
dfsHanota(i-1, buf, src, tar)
}
/* 求解河內塔問題 */
func solveHanota(A, B, C *list.List) {
n := A.Len()
// 將 A 頂部 n 個圓盤藉助 B 移到 C
dfsHanota(n, A, B, C)
}
@@ -0,0 +1,40 @@
// File: hanota_test.go
// Created Time: 2023-07-21
// Author: hongyun-robot (1836017030@qq.com)
package chapter_divide_and_conquer
import (
"container/list"
"fmt"
"testing"
. "github.com/krahets/hello-algo/pkg"
)
func TestHanota(t *testing.T) {
// 串列尾部是柱子頂部
A := list.New()
for i := 5; i > 0; i-- {
A.PushBack(i)
}
B := list.New()
C := list.New()
fmt.Println("初始狀態下:")
fmt.Print("A = ")
PrintList(A)
fmt.Print("B = ")
PrintList(B)
fmt.Print("C = ")
PrintList(C)
solveHanota(A, B, C)
fmt.Println("圓盤移動完成後:")
fmt.Print("A = ")
PrintList(A)
fmt.Print("B = ")
PrintList(B)
fmt.Print("C = ")
PrintList(C)
}