mirror of
https://github.com/krahets/hello-algo.git
synced 2026-07-11 23:16:07 +00:00
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:
@@ -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())
|
||||
}
|
||||
Reference in New Issue
Block a user