Add ru version (#1865)

* Add Russian docs site baseline

* Add Russian localized codebase

* Polish Russian code wording

* Update ru code translation.

* Update code translation and chapter covers.

* Fix pythontutor extraction.

* Add README and landing page.

* placeholder of profiles

* Use figures of English version

* Remove chapter paperbook
This commit is contained in:
Yudong Jin
2026-03-28 04:24:07 +08:00
committed by GitHub
parent 2ca570cc33
commit 772183705e
1958 changed files with 108186 additions and 0 deletions
@@ -0,0 +1,102 @@
/**
* File: array.kt
* Created Time: 2024-01-25
* Author: curtishd (1023632660@qq.com)
*/
package chapter_array_and_linkedlist
import java.util.concurrent.ThreadLocalRandom
/* Случайный доступ к элементу */
fun randomAccess(nums: IntArray): Int {
// Случайным образом выбрать число из интервала [0, nums.size)
val randomIndex = ThreadLocalRandom.current().nextInt(0, nums.size)
// Получить и вернуть случайный элемент
val randomNum = nums[randomIndex]
return randomNum
}
/* Увеличить длину массива */
fun extend(nums: IntArray, enlarge: Int): IntArray {
// Инициализировать массив увеличенной длины
val res = IntArray(nums.size + enlarge)
// Скопировать все элементы исходного массива в новый массив
for (i in nums.indices) {
res[i] = nums[i]
}
// Вернуть новый массив после расширения
return res
}
/* Вставить элемент num по индексу index в массив */
fun insert(nums: IntArray, num: Int, index: Int) {
// Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад
for (i in nums.size - 1 downTo index + 1) {
nums[i] = nums[i - 1]
}
// Присвоить num элементу по индексу index
nums[index] = num
}
/* Удалить элемент по индексу index */
fun remove(nums: IntArray, index: Int) {
// Сдвинуть все элементы после индекса index на одну позицию вперед
for (i in index..<nums.size - 1) {
nums[i] = nums[i + 1]
}
}
/* Обход массива */
fun traverse(nums: IntArray) {
var count = 0
// Обход массива по индексам
for (i in nums.indices) {
count += nums[i]
}
// Непосредственно обходить элементы массива
for (j in nums) {
count += j
}
}
/* Найти заданный элемент в массиве */
fun find(nums: IntArray, target: Int): Int {
for (i in nums.indices) {
if (nums[i] == target)
return i
}
return -1
}
/* Driver Code */
fun main() {
/* Инициализация массива */
val arr = IntArray(5)
println("Массив arr = ${arr.contentToString()}")
var nums = intArrayOf(1, 3, 2, 5, 4)
println("Массив nums = ${nums.contentToString()}")
/* Случайный доступ */
val randomNum: Int = randomAccess(nums)
println("Случайный элемент из nums = $randomNum")
/* Расширение длины */
nums = extend(nums, 3)
println("После увеличения длины массива до 8 nums = ${nums.contentToString()}")
/* Вставка элемента */
insert(nums, 6, 3)
println("После вставки числа 6 по индексу 3 nums = ${nums.contentToString()}")
/* Удаление элемента */
remove(nums, 2)
println("После удаления элемента по индексу 2 nums = ${nums.contentToString()}")
/* Обход массива */
traverse(nums)
/* Поиск элемента */
val index: Int = find(nums, 3)
println("Поиск элемента 3 в nums: индекс = $index")
}
@@ -0,0 +1,88 @@
/**
* File: linked_list.kt
* Created Time: 2024-01-25
* Author: curtishd (1023632660@qq.com)
*/
package chapter_array_and_linkedlist
import utils.ListNode
import utils.printLinkedList
/* Вставить узел P после узла n0 в связном списке */
fun insert(n0: ListNode?, p: ListNode?) {
val n1 = n0?.next
p?.next = n1
n0?.next = p
}
/* Удалить первый узел после узла n0 в связном списке */
fun remove(n0: ListNode?) {
if (n0?.next == null)
return
// n0 -> P -> n1
val p = n0.next
val n1 = p?.next
n0.next = n1
}
/* Доступ к узлу связного списка по индексу index */
fun access(head: ListNode?, index: Int): ListNode? {
var h = head
for (i in 0..<index) {
if (h == null)
return null
h = h.next
}
return h
}
/* Найти в связном списке первый узел со значением target */
fun find(head: ListNode?, target: Int): Int {
var index = 0
var h = head
while (h != null) {
if (h._val == target)
return index
h = h.next
index++
}
return -1
}
/* Driver Code */
fun main() {
/* Инициализация связного списка */
// Инициализация всех узлов
val n0 = ListNode(1)
val n1 = ListNode(3)
val n2 = ListNode(2)
val n3 = ListNode(5)
val n4 = ListNode(4)
// Построить ссылки между узлами
n0.next = n1
n1.next = n2
n2.next = n3
n3.next = n4
println("Исходный связный список")
printLinkedList(n0)
/* Вставка узла */
insert(n0, ListNode(0))
println("Связный список после вставки узла")
printLinkedList(n0)
/* Удаление узла */
remove(n0)
println("Связный список после удаления узла")
printLinkedList(n0)
/* Доступ к узлу */
val node = access(n0, 3)!!
println("Значение узла по индексу 3 в связном списке = ${node._val}")
/* Поиск узла */
val index = find(n0, 2)
println("Индекс узла со значением 2 в связном списке = $index")
}
@@ -0,0 +1,63 @@
/**
* File: list.kt
* Created Time: 2024-01-25
* Author: curtishd (1023632660@qq.com)
*/
package chapter_array_and_linkedlist
/* Driver Code */
fun main() {
/* Инициализация списка */
// Изменяемое множество
val nums = mutableListOf(1, 3, 2, 5, 4)
println("Список nums = $nums")
/* Доступ к элементу */
val num = nums[1]
println("Элемент по индексу 1: num = $num")
/* Обновление элемента */
nums[1] = 0
println("После обновления элемента по индексу 1 до 0 nums = $nums")
/* Очистить список */
nums.clear()
println("После очистки списка nums = $nums")
/* Добавление элемента в конец */
nums.add(1)
nums.add(3)
nums.add(2)
nums.add(5)
nums.add(4)
println("После добавления элементов nums = $nums")
/* Вставка элемента в середину */
nums.add(3, 6)
println("После вставки числа 6 по индексу 3 nums = $nums")
/* Удаление элемента */
nums.removeAt(3)
println("После удаления элемента по индексу 3 nums = $nums")
/* Обходить список по индексам */
var count = 0
for (i in nums.indices) {
count += nums[i]
}
/* Непосредственно обходить элементы списка */
for (j in nums) {
count += j
}
/* Объединить два списка */
val nums1 = mutableListOf(6, 8, 7, 10, 9)
nums.addAll(nums1)
println("После конкатенации списка nums1 к nums nums = $nums")
/* Отсортировать список */
nums.sort()
println("После сортировки списка nums = $nums")
}
@@ -0,0 +1,139 @@
/**
* File: my_list.kt
* Created Time: 2024-01-25
* Author: curtishd (1023632660@qq.com)
*/
package chapter_array_and_linkedlist
/* Класс списка */
class MyList {
private var arr: IntArray = intArrayOf() // Массив (для хранения элементов списка)
private var capacity: Int = 10 // Вместимость списка
private var size: Int = 0 // Длина списка (текущее число элементов)
private var extendRatio: Int = 2 // Коэффициент увеличения списка при каждом расширении
/* Конструктор */
init {
arr = IntArray(capacity)
}
/* Получить длину списка (текущее число элементов) */
fun size(): Int {
return size
}
/* Получить вместимость списка */
fun capacity(): Int {
return capacity
}
/* Доступ к элементу */
fun get(index: Int): Int {
// Если индекс выходит за границы, выбрасывается исключение; далее аналогично
if (index < 0 || index >= size)
throw IndexOutOfBoundsException("индекс выходит за границы")
return arr[index]
}
/* Обновление элемента */
fun set(index: Int, num: Int) {
if (index < 0 || index >= size)
throw IndexOutOfBoundsException("индекс выходит за границы")
arr[index] = num
}
/* Добавление элемента в конец */
fun add(num: Int) {
// При превышении вместимости по числу элементов запускается расширение
if (size == capacity())
extendCapacity()
arr[size] = num
// Обновить число элементов
size++
}
/* Вставка элемента в середину */
fun insert(index: Int, num: Int) {
if (index < 0 || index >= size)
throw IndexOutOfBoundsException("индекс выходит за границы")
// При превышении вместимости по числу элементов запускается расширение
if (size == capacity())
extendCapacity()
// Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад
for (j in size - 1 downTo index)
arr[j + 1] = arr[j]
arr[index] = num
// Обновить число элементов
size++
}
/* Удаление элемента */
fun remove(index: Int): Int {
if (index < 0 || index >= size)
throw IndexOutOfBoundsException("индекс выходит за границы")
val num = arr[index]
// Сдвинуть все элементы после индекса index на одну позицию вперед
for (j in index..<size - 1)
arr[j] = arr[j + 1]
// Обновить число элементов
size--
// Вернуть удаленный элемент
return num
}
/* Расширение списка */
fun extendCapacity() {
// Создать новый массив длиной в extendRatio раз больше исходного и скопировать в него исходный массив
arr = arr.copyOf(capacity() * extendRatio)
// Обновить вместимость списка
capacity = arr.size
}
/* Преобразовать список в массив */
fun toArray(): IntArray {
val size = size()
// Преобразовывать только элементы списка в пределах фактической длины
val arr = IntArray(size)
for (i in 0..<size) {
arr[i] = get(i)
}
return arr
}
}
/* Driver Code */
fun main() {
/* Инициализация списка */
val nums = MyList()
/* Добавление элемента в конец */
nums.add(1)
nums.add(3)
nums.add(2)
nums.add(5)
nums.add(4)
println("Список nums = ${nums.toArray().contentToString()}, вместимость = ${nums.capacity()}, длина = ${nums.size()}")
/* Вставка элемента в середину */
nums.insert(3, 6)
println("После вставки числа 6 по индексу 3 nums = ${nums.toArray().contentToString()}")
/* Удаление элемента */
nums.remove(3)
println("После удаления элемента по индексу 3 nums = ${nums.toArray().contentToString()}")
/* Доступ к элементу */
val num = nums.get(1)
println("Элемент по индексу 1: num = $num")
/* Обновление элемента */
nums.set(1, 0)
println("После обновления элемента по индексу 1 до 0 nums = ${nums.toArray().contentToString()}")
/* Проверка механизма расширения */
for (i in 0..9) {
// При i = 5 длина списка превысит его вместимость, и в этот момент сработает механизм расширения
nums.add(i)
}
println("Список nums после увеличения вместимости = ${nums.toArray().contentToString()}, вместимость = ${nums.capacity()}, длина = ${nums.size()}")
}