mirror of
https://github.com/krahets/hello-algo.git
synced 2026-08-13 20:20:58 +00:00
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:
@@ -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()}")
|
||||
}
|
||||
Reference in New Issue
Block a user