Re-translate the Japanese version (#1871)

* Retranslate Japanese docs with GPT-5.4

* Retranslate Japanese code with GPT-5.4
This commit is contained in:
Yudong Jin
2026-03-30 07:30:15 +08:00
committed by GitHub
parent fe6443235b
commit d7b2277d2b
1444 changed files with 83312 additions and 8363 deletions
@@ -0,0 +1,79 @@
// File: array.go
// Created Time: 2022-12-29
// Author: GuoWei (gongguowei01@gmail.com), cathay (cathaycchen@gmail.com)
package chapter_array_and_linkedlist
import (
"math/rand"
)
/* 要素へランダムアクセス */
func randomAccess(nums []int) (randomNum int) {
// 区間 [0, nums.length) からランダムに 1 つの数を選ぶ
randomIndex := rand.Intn(len(nums))
// ランダムな要素を取得して返す
randomNum = nums[randomIndex]
return
}
/* 配列長を拡張する */
func extend(nums []int, enlarge int) []int {
// 拡張後の長さを持つ配列を初期化する
res := make([]int, len(nums)+enlarge)
// 元の配列の全要素を新しい配列にコピー
for i, num := range nums {
res[i] = num
}
// 拡張後の新しい配列を返す
return res
}
/* 配列の index 番目に要素 num を挿入 */
func insert(nums []int, num int, index int) {
// インデックス index 以降の全要素を 1 つ後ろへ移動する
for i := len(nums) - 1; i > index; i-- {
nums[i] = nums[i-1]
}
// index の要素に num を代入する
nums[index] = num
}
/* index の要素を削除する */
func remove(nums []int, index int) {
// インデックス index より後ろの全要素を 1 つ前へ移動する
for i := index; i < len(nums)-1; i++ {
nums[i] = nums[i+1]
}
}
/* 配列を走査 */
func traverse(nums []int) {
count := 0
// インデックスで配列を走査
for i := 0; i < len(nums); i++ {
count += nums[i]
}
count = 0
// 配列要素を直接走査
for _, num := range nums {
count += num
}
// データのインデックスと要素を同時に走査する
for i, num := range nums {
count += nums[i]
count += num
}
}
/* 配列内で指定要素を探す */
func find(nums []int, target int) (index int) {
index = -1
for i := 0; i < len(nums); i++ {
if nums[i] == target {
index = i
break
}
}
return
}
@@ -0,0 +1,50 @@
// File: array_test.go
// Created Time: 2022-12-29
// Author: GuoWei (gongguowei01@gmail.com), cathay (cathaycchen@gmail.com)
package chapter_array_and_linkedlist
/**
* ここでは Go の Slice を Array 配列とみなします。これは
* 理解コストを下げ、データ構造とアルゴリズムに集中しやすくするためです。
*/
import (
"fmt"
"testing"
)
/* Driver Code */
func TestArray(t *testing.T) {
/* 配列を初期化 */
var arr [5]int
fmt.Println("配列 arr =", arr)
// Go では、長さを指定する場合([5]int)は配列、指定しない場合([]int)はスライスである
// Go の配列はコンパイル時に長さが確定するよう設計されているため、長さには定数しか使えない
// extend() 関数を実装しやすくするため、以下ではスライス(Slice)を配列(Array)として扱う
nums := []int{1, 3, 2, 5, 4}
fmt.Println("配列 nums =", nums)
/* ランダムアクセス */
randomNum := randomAccess(nums)
fmt.Println("nums からランダムな要素を取得", randomNum)
/* 長さを拡張 */
nums = extend(nums, 3)
fmt.Println("配列の長さを 8 に拡張し,nums =", nums)
/* 要素を挿入する */
insert(nums, 6, 3)
fmt.Println("インデックス 3 に数値 6 を挿入し,nums =", nums)
/* 要素を削除 */
remove(nums, 2)
fmt.Println("インデックス 2 の要素を削除すると、nums =", nums)
/* 配列を走査 */
traverse(nums)
/* 要素を探索する */
index := find(nums, 3)
fmt.Println("nums 内で要素 3 を検索すると、インデックス =", index)
}
@@ -0,0 +1,51 @@
// File: linked_list.go
// Created Time: 2022-12-29
// Author: cathay (cathaycchen@gmail.com)
package chapter_array_and_linkedlist
import (
. "github.com/krahets/hello-algo/pkg"
)
/* 連結リストでノード n0 の後ろにノード P を挿入する */
func insertNode(n0 *ListNode, P *ListNode) {
n1 := n0.Next
P.Next = n1
n0.Next = P
}
/* 連結リストでノード n0 の直後のノードを削除する */
func removeItem(n0 *ListNode) {
if n0.Next == nil {
return
}
// n0 -> P -> n1
P := n0.Next
n1 := P.Next
n0.Next = n1
}
/* 連結リスト内で index 番目のノードにアクセス */
func access(head *ListNode, index int) *ListNode {
for i := 0; i < index; i++ {
if head == nil {
return nil
}
head = head.Next
}
return head
}
/* 連結リストで値が target の最初のノードを探す */
func findNode(head *ListNode, target int) int {
index := 0
for head != nil {
if head.Val == target {
return index
}
head = head.Next
index++
}
return -1
}
@@ -0,0 +1,48 @@
// File: linked_list_test.go
// Created Time: 2022-12-29
// Author: cathay (cathaycchen@gmail.com)
package chapter_array_and_linkedlist
import (
"fmt"
"testing"
. "github.com/krahets/hello-algo/pkg"
)
func TestLinkedList(t *testing.T) {
/* 連結リスト 1 -> 3 -> 2 -> 5 -> 4 を初期化する */
// 各ノードを初期化
n0 := NewListNode(1)
n1 := NewListNode(3)
n2 := NewListNode(2)
n3 := NewListNode(5)
n4 := NewListNode(4)
// ノード間の参照を構築する
n0.Next = n1
n1.Next = n2
n2.Next = n3
n3.Next = n4
fmt.Println("初期化した連結リストは")
PrintLinkedList(n0)
/* ノードを挿入 */
insertNode(n0, NewListNode(0))
fmt.Println("ノード挿入後の連結リストは")
PrintLinkedList(n0)
/* ノードを削除 */
removeItem(n0)
fmt.Println("ノード削除後の連結リストは")
PrintLinkedList(n0)
/* ノードにアクセス */
node := access(n0, 3)
fmt.Println("連結リスト内のインデックス 3 のノードの値 =", node)
/* ノードを探索 */
index := findNode(n0, 2)
fmt.Println("連結リスト内で値が 2 のノードのインデックス =", index)
}
@@ -0,0 +1,66 @@
// File: list_test.go
// Created Time: 2022-12-18
// Author: msk397 (machangxinq@gmail.com)
package chapter_array_and_linkedlist
import (
"fmt"
"sort"
"testing"
)
/* Driver Code */
func TestList(t *testing.T) {
/* リストを初期化 */
nums := []int{1, 3, 2, 5, 4}
fmt.Println("リスト nums =", nums)
/* 要素にアクセス */
num := nums[1] // インデックス 1 の要素にアクセス
fmt.Println("インデックス 1 の要素にアクセスすると、num =", num)
/* 要素を更新 */
nums[1] = 0 // 添字 1 の要素を 0 に更新
fmt.Println("インデックス 1 の要素を 0 に更新すると、nums =", nums)
/* リストを空にする */
nums = nil
fmt.Println("リストを空にした後の nums =", nums)
/* 末尾に要素を追加 */
nums = append(nums, 1)
nums = append(nums, 3)
nums = append(nums, 2)
nums = append(nums, 5)
nums = append(nums, 4)
fmt.Println("要素追加後の nums =", nums)
/* 中間に要素を挿入 */
nums = append(nums[:3], append([]int{6}, nums[3:]...)...) // 添字 3 に数字 6 を挿入
fmt.Println("インデックス 3 に数値 6 を挿入し,nums =", nums)
/* 要素を削除 */
nums = append(nums[:3], nums[4:]...) // インデックス 3 の要素を削除する
fmt.Println("インデックス 3 の要素を削除すると、nums =", nums)
/* インデックスでリストを走査 */
count := 0
for i := 0; i < len(nums); i++ {
count += nums[i]
}
/* リスト要素を直接走査 */
count = 0
for _, x := range nums {
count += x
}
/* 2 つのリストを連結する */
nums1 := []int{6, 8, 7, 10, 9}
nums = append(nums, nums1...) // リスト nums1 を nums の後ろに連結
fmt.Println("リスト nums1 を nums の後ろに連結すると、nums =", nums)
/* リストをソート */
sort.Ints(nums) // ソート後、リスト要素は小さい順に並ぶ
fmt.Println("リストをソートすると、nums =", nums)
}
@@ -0,0 +1,109 @@
// File: my_list.go
// Created Time: 2022-12-18
// Author: msk397 (machangxinq@gmail.com)
package chapter_array_and_linkedlist
/* リストクラス */
type myList struct {
arrCapacity int
arr []int
arrSize int
extendRatio int
}
/* コンストラクタ */
func newMyList() *myList {
return &myList{
arrCapacity: 10, // リスト容量
arr: make([]int, 10), // 配列(リスト要素を格納)
arrSize: 0, // リストの長さ(現在の要素数)
extendRatio: 2, // リスト拡張時の増加倍率
}
}
/* リストの長さを取得(現在の要素数) */
func (l *myList) size() int {
return l.arrSize
}
/* リスト容量を取得する */
func (l *myList) capacity() int {
return l.arrCapacity
}
/* 要素にアクセス */
func (l *myList) get(index int) int {
// インデックスが範囲外なら例外を送出する。以下同様
if index < 0 || index >= l.arrSize {
panic("インデックスが範囲外です")
}
return l.arr[index]
}
/* 要素を更新 */
func (l *myList) set(num, index int) {
if index < 0 || index >= l.arrSize {
panic("インデックスが範囲外です")
}
l.arr[index] = num
}
/* 末尾に要素を追加 */
func (l *myList) add(num int) {
// 要素数が容量を超えると、拡張機構が発動する
if l.arrSize == l.arrCapacity {
l.extendCapacity()
}
l.arr[l.arrSize] = num
// 要素数を更新
l.arrSize++
}
/* 中間に要素を挿入 */
func (l *myList) insert(num, index int) {
if index < 0 || index >= l.arrSize {
panic("インデックスが範囲外です")
}
// 要素数が容量を超えると、拡張機構が発動する
if l.arrSize == l.arrCapacity {
l.extendCapacity()
}
// index 以降の要素をすべて 1 つ後ろへずらす
for j := l.arrSize - 1; j >= index; j-- {
l.arr[j+1] = l.arr[j]
}
l.arr[index] = num
// 要素数を更新
l.arrSize++
}
/* 要素を削除 */
func (l *myList) remove(index int) int {
if index < 0 || index >= l.arrSize {
panic("インデックスが範囲外です")
}
num := l.arr[index]
// インデックス index より後の要素をすべて 1 つ前に移動する
for j := index; j < l.arrSize-1; j++ {
l.arr[j] = l.arr[j+1]
}
// 要素数を更新
l.arrSize--
// 削除された要素を返す
return num
}
/* リストの拡張 */
func (l *myList) extendCapacity() {
// 元の配列の extendRatio 倍の長さを持つ新しい配列を作成し、元の配列をコピーする
l.arr = append(l.arr, make([]int, l.arrCapacity*(l.extendRatio-1))...)
// リストの容量を更新
l.arrCapacity = len(l.arr)
}
/* 有効長のリストを返す */
func (l *myList) toArray() []int {
// 有効長の範囲内のリスト要素のみを変換
return l.arr[:l.arrSize]
}
@@ -0,0 +1,46 @@
// File: my_list_test.go
// Created Time: 2022-12-18
// Author: msk397 (machangxinq@gmail.com)
package chapter_array_and_linkedlist
import (
"fmt"
"testing"
)
/* Driver Code */
func TestMyList(t *testing.T) {
/* リストを初期化 */
nums := newMyList()
/* 末尾に要素を追加 */
nums.add(1)
nums.add(3)
nums.add(2)
nums.add(5)
nums.add(4)
fmt.Printf("リスト nums = %v 、容量 = %v 、長さ = %v\n", nums.toArray(), nums.capacity(), nums.size())
/* 中間に要素を挿入 */
nums.insert(6, 3)
fmt.Printf("インデックス 3 に数字 6 を挿入すると、nums = %v\n", nums.toArray())
/* 要素を削除 */
nums.remove(3)
fmt.Printf("インデックス 3 の要素を削除すると、nums = %v\n", nums.toArray())
/* 要素にアクセス */
num := nums.get(1)
fmt.Printf("インデックス 1 の要素にアクセスすると、num = %v\n", num)
/* 要素を更新 */
nums.set(0, 1)
fmt.Printf("インデックス 1 の要素を 0 に更新すると、nums = %v\n", nums.toArray())
/* 拡張機構をテストする */
for i := 0; i < 10; i++ {
// i = 5 のとき、リスト長が容量を超えるため、この時点で拡張機構が発動する
nums.add(i)
}
fmt.Printf("拡張後のリスト nums = %v 、容量 = %v 、長さ = %v\n", nums.toArray(), nums.capacity(), nums.size())
}