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,148 @@
/**
* File: array_deque.swift
* Created Time: 2023-02-22
* Author: nuomi1 (nuomi1@qq.com)
*/
/* 循環配列ベースの両端キュー */
class ArrayDeque {
private var nums: [Int] // 両端キューの要素を格納する配列
private var front: Int // 先頭ポインタ。先頭要素を指す
private var _size: Int // 両端キューの長さ
/* コンストラクタ */
init(capacity: Int) {
nums = Array(repeating: 0, count: capacity)
front = 0
_size = 0
}
/* 両端キューの容量を取得 */
func capacity() -> Int {
nums.count
}
/* 両端キューの長さを取得 */
func size() -> Int {
_size
}
/* 両端キューが空かどうかを判定 */
func isEmpty() -> Bool {
size() == 0
}
/* 循環配列のインデックスを計算 */
private func index(i: Int) -> Int {
// 剰余演算により配列の先頭と末尾をつなげる
// i が配列の末尾を越えたら先頭に戻る
// i が配列の先頭を越えて前に出たら末尾に戻る
(i + capacity()) % capacity()
}
/* キュー先頭にエンキュー */
func pushFirst(num: Int) {
if size() == capacity() {
print("両端キューがいっぱいです")
return
}
// 先頭ポインタを左に 1 つ移動する
// 剰余演算により、front が配列先頭を越えた後に末尾へ戻るようにする
front = index(i: front - 1)
// num をキュー先頭に追加
nums[front] = num
_size += 1
}
/* キュー末尾にエンキュー */
func pushLast(num: Int) {
if size() == capacity() {
print("両端キューがいっぱいです")
return
}
// キュー末尾ポインタを計算し、末尾インデックス + 1 を指す
let rear = index(i: front + size())
// num をキュー末尾に追加
nums[rear] = num
_size += 1
}
/* キュー先頭からデキュー */
func popFirst() -> Int {
let num = peekFirst()
// 先頭ポインタを 1 つ後ろへ進める
front = index(i: front + 1)
_size -= 1
return num
}
/* キュー末尾からデキュー */
func popLast() -> Int {
let num = peekLast()
_size -= 1
return num
}
/* キュー先頭の要素にアクセス */
func peekFirst() -> Int {
if isEmpty() {
fatalError("両端キューが空です")
}
return nums[front]
}
/* キュー末尾の要素にアクセス */
func peekLast() -> Int {
if isEmpty() {
fatalError("両端キューが空です")
}
// 末尾要素のインデックスを計算
let last = index(i: front + size() - 1)
return nums[last]
}
/* 出力用の配列を返す */
func toArray() -> [Int] {
// 有効長の範囲内のリスト要素のみを変換
(front ..< front + size()).map { nums[index(i: $0)] }
}
}
@main
enum _ArrayDeque {
/* Driver Code */
static func main() {
/* 両端キューを初期化 */
let deque = ArrayDeque(capacity: 10)
deque.pushLast(num: 3)
deque.pushLast(num: 2)
deque.pushLast(num: 5)
print("両端キュー deque = \(deque.toArray())")
/* 要素にアクセス */
let peekFirst = deque.peekFirst()
print("先頭要素 peekFirst = \(peekFirst)")
let peekLast = deque.peekLast()
print("末尾要素 peekLast = \(peekLast)")
/* 要素をエンキュー */
deque.pushLast(num: 4)
print("要素 4 を末尾に追加した後 deque = \(deque.toArray())")
deque.pushFirst(num: 1)
print("要素 1 を先頭に追加した後 deque = \(deque.toArray())")
/* 要素をデキュー */
let popLast = deque.popLast()
print("末尾から取り出した要素 = \(popLast),末尾から取り出した後 deque = \(deque.toArray())")
let popFirst = deque.popFirst()
print("先頭から取り出した要素 = \(popFirst),先頭から取り出した後 deque = \(deque.toArray())")
/* 両端キューの長さを取得 */
let size = deque.size()
print("両端キューのサイズ size = \(size)")
/* 両端キューが空かどうかを判定 */
let isEmpty = deque.isEmpty()
print("両端キューが空かどうか = \(isEmpty)")
}
}
@@ -0,0 +1,113 @@
/**
* File: array_queue.swift
* Created Time: 2023-01-11
* Author: nuomi1 (nuomi1@qq.com)
*/
/* 循環配列ベースのキュー */
class ArrayQueue {
private var nums: [Int] // キュー要素を格納する配列
private var front: Int // 先頭ポインタ。先頭要素を指す
private var _size: Int // キューの長さ
init(capacity: Int) {
// 配列を初期化
nums = Array(repeating: 0, count: capacity)
front = 0
_size = 0
}
/* キューの容量を取得 */
func capacity() -> Int {
nums.count
}
/* キューの長さを取得 */
func size() -> Int {
_size
}
/* キューが空かどうかを判定 */
func isEmpty() -> Bool {
size() == 0
}
/* エンキュー */
func push(num: Int) {
if size() == capacity() {
print("キューがいっぱいです")
return
}
// 末尾ポインタを計算し、末尾インデックス + 1 を指す
// 剰余演算により、rear が配列末尾を越えた後に先頭へ戻るようにする
let rear = (front + size()) % capacity()
// num をキュー末尾に追加
nums[rear] = num
_size += 1
}
/* デキュー */
@discardableResult
func pop() -> Int {
let num = peek()
// 先頭ポインタを1つ後ろへ進め、末尾を越えたら配列先頭に戻す
front = (front + 1) % capacity()
_size -= 1
return num
}
/* キュー先頭の要素にアクセス */
func peek() -> Int {
if isEmpty() {
fatalError("キューが空です")
}
return nums[front]
}
/* 配列を返す */
func toArray() -> [Int] {
// 有効長の範囲内のリスト要素のみを変換
(front ..< front + size()).map { nums[$0 % capacity()] }
}
}
@main
enum _ArrayQueue {
/* Driver Code */
static func main() {
/* キューを初期化 */
let capacity = 10
let queue = ArrayQueue(capacity: capacity)
/* 要素をエンキュー */
queue.push(num: 1)
queue.push(num: 3)
queue.push(num: 2)
queue.push(num: 5)
queue.push(num: 4)
print("キュー queue = \(queue.toArray())")
/* キュー先頭の要素にアクセス */
let peek = queue.peek()
print("先頭要素 peek = \(peek)")
/* 要素をデキュー */
let pop = queue.pop()
print("取り出した要素 pop = \(pop),取り出し後 queue = \(queue.toArray())")
/* キューの長さを取得 */
let size = queue.size()
print("キューのサイズ size = \(size)")
/* キューが空かどうかを判定 */
let isEmpty = queue.isEmpty()
print("キューが空かどうか = \(isEmpty)")
/* 循環配列をテストする */
for i in 0 ..< 10 {
queue.push(num: i)
queue.pop()
print("第 \(i) 回のエンキュー + デキュー後 queue = \(queue.toArray())")
}
}
}
@@ -0,0 +1,85 @@
/**
* File: array_stack.swift
* Created Time: 2023-01-09
* Author: nuomi1 (nuomi1@qq.com)
*/
/* 配列ベースのスタック */
class ArrayStack {
private var stack: [Int]
init() {
// リスト(動的配列)を初期化する
stack = []
}
/* スタックの長さを取得 */
func size() -> Int {
stack.count
}
/* スタックが空かどうかを判定 */
func isEmpty() -> Bool {
stack.isEmpty
}
/* プッシュ */
func push(num: Int) {
stack.append(num)
}
/* ポップ */
@discardableResult
func pop() -> Int {
if isEmpty() {
fatalError("スタックが空です")
}
return stack.removeLast()
}
/* スタックトップの要素にアクセス */
func peek() -> Int {
if isEmpty() {
fatalError("スタックが空です")
}
return stack.last!
}
/* List を Array に変換して返す */
func toArray() -> [Int] {
stack
}
}
@main
enum _ArrayStack {
/* Driver Code */
static func main() {
/* スタックを初期化 */
let stack = ArrayStack()
/* 要素をプッシュ */
stack.push(num: 1)
stack.push(num: 3)
stack.push(num: 2)
stack.push(num: 5)
stack.push(num: 4)
print("スタック stack = \(stack.toArray())")
/* スタックトップの要素にアクセス */
let peek = stack.peek()
print("スタックトップ要素 peek = \(peek)")
/* 要素をポップ */
let pop = stack.pop()
print("ポップした要素 pop = \(pop)、ポップ後の stack = \(stack.toArray())")
/* スタックの長さを取得 */
let size = stack.size()
print("スタックの長さ size = \(size)")
/* 空かどうかを判定 */
let isEmpty = stack.isEmpty()
print("スタックが空かどうか = \(isEmpty)")
}
}
@@ -0,0 +1,44 @@
/**
* File: deque.swift
* Created Time: 2023-01-14
* Author: nuomi1 (nuomi1@qq.com)
*/
@main
enum Deque {
/* Driver Code */
static func main() {
/* 両端キューを初期化 */
// Swift には組み込みの両端キュークラスがないため、Array を両端キューとして使う
var deque: [Int] = []
/* 要素をエンキュー */
deque.append(2)
deque.append(5)
deque.append(4)
deque.insert(3, at: 0)
deque.insert(1, at: 0)
print("両端キュー deque = \(deque)")
/* 要素にアクセス */
let peekFirst = deque.first!
print("先頭要素 peekFirst = \(peekFirst)")
let peekLast = deque.last!
print("末尾要素 peekLast = \(peekLast)")
/* 要素をデキュー */
// Array を用いる場合、popFirst の計算量は O(n)
let popFirst = deque.removeFirst()
print("先頭からデキューした要素 popFirst = \(popFirst)、先頭からデキュー後の deque = \(deque)")
let popLast = deque.removeLast()
print("末尾からデキューした要素 popLast = \(popLast)、末尾からデキュー後の deque = \(deque)")
/* 両端キューの長さを取得 */
let size = deque.count
print("両端キューのサイズ size = \(size)")
/* 両端キューが空かどうかを判定 */
let isEmpty = deque.isEmpty
print("両端キューが空かどうか = \(isEmpty)")
}
}
@@ -0,0 +1,180 @@
/**
* File: linkedlist_deque.swift
* Created Time: 2023-02-22
* Author: nuomi1 (nuomi1@qq.com)
*/
/* 双方向連結リストノード */
class ListNode {
var val: Int // ノード値
var next: ListNode? // 後続ノードへの参照
weak var prev: ListNode? // 前駆ノードへの参照
init(val: Int) {
self.val = val
}
}
/* 双方向連結リストベースの両端キュー */
class LinkedListDeque {
private var front: ListNode? // 先頭ノード front
private var rear: ListNode? // 末尾ノード rear
private var _size: Int // 両端キューの長さ
init() {
_size = 0
}
/* 両端キューの長さを取得 */
func size() -> Int {
_size
}
/* 両端キューが空かどうかを判定 */
func isEmpty() -> Bool {
size() == 0
}
/* エンキュー操作 */
private func push(num: Int, isFront: Bool) {
let node = ListNode(val: num)
// 連結リストが空なら、front と rear の両方を node に向ける
if isEmpty() {
front = node
rear = node
}
// 先頭へのエンキュー操作
else if isFront {
// node を連結リストの先頭に追加
front?.prev = node
node.next = front
front = node // 先頭ノードを更新する
}
// 末尾へのエンキュー操作
else {
// node を連結リストの末尾に追加
rear?.next = node
node.prev = rear
rear = node // 末尾ノードを更新する
}
_size += 1 // キューの長さを更新
}
/* キュー先頭にエンキュー */
func pushFirst(num: Int) {
push(num: num, isFront: true)
}
/* キュー末尾にエンキュー */
func pushLast(num: Int) {
push(num: num, isFront: false)
}
/* デキュー操作 */
private func pop(isFront: Bool) -> Int {
if isEmpty() {
fatalError("両端キューが空です")
}
let val: Int
// キュー先頭からの取り出し
if isFront {
val = front!.val // 先頭ノードの値を一時保存
// 先頭ノードを削除
let fNext = front?.next
if fNext != nil {
fNext?.prev = nil
front?.next = nil
}
front = fNext // 先頭ノードを更新する
}
// キュー末尾からの取り出し
else {
val = rear!.val // 末尾ノードの値を一時保存
// 末尾ノードを削除
let rPrev = rear?.prev
if rPrev != nil {
rPrev?.next = nil
rear?.prev = nil
}
rear = rPrev // 末尾ノードを更新する
}
_size -= 1 // キューの長さを更新
return val
}
/* キュー先頭からデキュー */
func popFirst() -> Int {
pop(isFront: true)
}
/* キュー末尾からデキュー */
func popLast() -> Int {
pop(isFront: false)
}
/* キュー先頭の要素にアクセス */
func peekFirst() -> Int {
if isEmpty() {
fatalError("両端キューが空です")
}
return front!.val
}
/* キュー末尾の要素にアクセス */
func peekLast() -> Int {
if isEmpty() {
fatalError("両端キューが空です")
}
return rear!.val
}
/* 出力用の配列を返す */
func toArray() -> [Int] {
var node = front
var res = Array(repeating: 0, count: size())
for i in res.indices {
res[i] = node!.val
node = node?.next
}
return res
}
}
@main
enum _LinkedListDeque {
/* Driver Code */
static func main() {
/* 両端キューを初期化 */
let deque = LinkedListDeque()
deque.pushLast(num: 3)
deque.pushLast(num: 2)
deque.pushLast(num: 5)
print("両端キュー deque = \(deque.toArray())")
/* 要素にアクセス */
let peekFirst = deque.peekFirst()
print("先頭要素 peekFirst = \(peekFirst)")
let peekLast = deque.peekLast()
print("末尾要素 peekLast = \(peekLast)")
/* 要素をエンキュー */
deque.pushLast(num: 4)
print("要素 4 を末尾に追加した後 deque = \(deque.toArray())")
deque.pushFirst(num: 1)
print("要素 1 を先頭に追加した後 deque = \(deque.toArray())")
/* 要素をデキュー */
let popLast = deque.popLast()
print("末尾から取り出した要素 = \(popLast),末尾から取り出した後 deque = \(deque.toArray())")
let popFirst = deque.popFirst()
print("先頭から取り出した要素 = \(popFirst),先頭から取り出した後 deque = \(deque.toArray())")
/* 両端キューの長さを取得 */
let size = deque.size()
print("両端キューのサイズ size = \(size)")
/* 両端キューが空かどうかを判定 */
let isEmpty = deque.isEmpty()
print("両端キューが空かどうか = \(isEmpty)")
}
}
@@ -0,0 +1,107 @@
/**
* File: linkedlist_queue.swift
* Created Time: 2023-01-11
* Author: nuomi1 (nuomi1@qq.com)
*/
import utils
/* 連結リストベースのキュー */
class LinkedListQueue {
private var front: ListNode? // 先頭ノード
private var rear: ListNode? // 末尾ノード
private var _size: Int
init() {
_size = 0
}
/* キューの長さを取得 */
func size() -> Int {
_size
}
/* キューが空かどうかを判定 */
func isEmpty() -> Bool {
size() == 0
}
/* エンキュー */
func push(num: Int) {
// 末尾ノードの後ろに num を追加
let node = ListNode(x: num)
// キューが空なら、先頭・末尾ノードをともにそのノードに設定
if front == nil {
front = node
rear = node
}
// キューが空でなければ、そのノードを末尾ノードの後ろに追加
else {
rear?.next = node
rear = node
}
_size += 1
}
/* デキュー */
@discardableResult
func pop() -> Int {
let num = peek()
// 先頭ノードを削除
front = front?.next
_size -= 1
return num
}
/* キュー先頭の要素にアクセス */
func peek() -> Int {
if isEmpty() {
fatalError("キューが空です")
}
return front!.val
}
/* 連結リストを Array に変換して返す */
func toArray() -> [Int] {
var node = front
var res = Array(repeating: 0, count: size())
for i in res.indices {
res[i] = node!.val
node = node?.next
}
return res
}
}
@main
enum _LinkedListQueue {
/* Driver Code */
static func main() {
/* キューを初期化 */
let queue = LinkedListQueue()
/* 要素をエンキュー */
queue.push(num: 1)
queue.push(num: 3)
queue.push(num: 2)
queue.push(num: 5)
queue.push(num: 4)
print("キュー queue = \(queue.toArray())")
/* キュー先頭の要素にアクセス */
let peek = queue.peek()
print("先頭要素 peek = \(peek)")
/* 要素をデキュー */
let pop = queue.pop()
print("取り出した要素 pop = \(pop),取り出し後 queue = \(queue.toArray())")
/* キューの長さを取得 */
let size = queue.size()
print("キューのサイズ size = \(size)")
/* キューが空かどうかを判定 */
let isEmpty = queue.isEmpty()
print("キューが空かどうか = \(isEmpty)")
}
}
@@ -0,0 +1,96 @@
/**
* File: linkedlist_stack.swift
* Created Time: 2023-01-09
* Author: nuomi1 (nuomi1@qq.com)
*/
import utils
/* 連結リストベースのスタック */
class LinkedListStack {
private var _peek: ListNode? // 先頭ノードをスタックトップとする
private var _size: Int // スタックの長さ
init() {
_size = 0
}
/* スタックの長さを取得 */
func size() -> Int {
_size
}
/* スタックが空かどうかを判定 */
func isEmpty() -> Bool {
size() == 0
}
/* プッシュ */
func push(num: Int) {
let node = ListNode(x: num)
node.next = _peek
_peek = node
_size += 1
}
/* ポップ */
@discardableResult
func pop() -> Int {
let num = peek()
_peek = _peek?.next
_size -= 1
return num
}
/* スタックトップの要素にアクセス */
func peek() -> Int {
if isEmpty() {
fatalError("スタックが空です")
}
return _peek!.val
}
/* List を Array に変換して返す */
func toArray() -> [Int] {
var node = _peek
var res = Array(repeating: 0, count: size())
for i in res.indices.reversed() {
res[i] = node!.val
node = node?.next
}
return res
}
}
@main
enum _LinkedListStack {
/* Driver Code */
static func main() {
/* スタックを初期化 */
let stack = LinkedListStack()
/* 要素をプッシュ */
stack.push(num: 1)
stack.push(num: 3)
stack.push(num: 2)
stack.push(num: 5)
stack.push(num: 4)
print("スタック stack = \(stack.toArray())")
/* スタックトップの要素にアクセス */
let peek = stack.peek()
print("スタックトップ要素 peek = \(peek)")
/* 要素をポップ */
let pop = stack.pop()
print("ポップした要素 pop = \(pop)、ポップ後の stack = \(stack.toArray())")
/* スタックの長さを取得 */
let size = stack.size()
print("スタックの長さ size = \(size)")
/* 空かどうかを判定 */
let isEmpty = stack.isEmpty()
print("スタックが空かどうか = \(isEmpty)")
}
}
@@ -0,0 +1,40 @@
/**
* File: queue.swift
* Created Time: 2023-01-11
* Author: nuomi1 (nuomi1@qq.com)
*/
@main
enum Queue {
/* Driver Code */
static func main() {
/* キューを初期化 */
// Swift には組み込みのキュークラスがないため、Array をキューとして使う
var queue: [Int] = []
/* 要素をエンキュー */
queue.append(1)
queue.append(3)
queue.append(2)
queue.append(5)
queue.append(4)
print("キュー queue = \(queue)")
/* キュー先頭の要素にアクセス */
let peek = queue.first!
print("先頭要素 peek = \(peek)")
/* 要素をデキュー */
// Array を用いる場合、pop の計算量は O(n)
let pool = queue.removeFirst()
print("デキューした要素 pop = \(pool)、デキュー後の queue = \(queue)")
/* キューの長さを取得 */
let size = queue.count
print("キューのサイズ size = \(size)")
/* キューが空かどうかを判定 */
let isEmpty = queue.isEmpty
print("キューが空かどうか = \(isEmpty)")
}
}
@@ -0,0 +1,39 @@
/**
* File: stack.swift
* Created Time: 2023-01-09
* Author: nuomi1 (nuomi1@qq.com)
*/
@main
enum Stack {
/* Driver Code */
static func main() {
/* スタックを初期化 */
// Swift には組み込みのスタッククラスがないため、Array をスタックとして使う
var stack: [Int] = []
/* 要素をプッシュ */
stack.append(1)
stack.append(3)
stack.append(2)
stack.append(5)
stack.append(4)
print("スタック stack = \(stack)")
/* スタックトップの要素にアクセス */
let peek = stack.last!
print("スタックトップ要素 peek = \(peek)")
/* 要素をポップ */
let pop = stack.removeLast()
print("ポップした要素 pop = \(pop)、ポップ後の stack = \(stack)")
/* スタックの長さを取得 */
let size = stack.count
print("スタックの長さ size = \(size)")
/* 空かどうかを判定 */
let isEmpty = stack.isEmpty
print("スタックが空かどうか = \(isEmpty)")
}
}