mirror of
https://github.com/krahets/hello-algo.git
synced 2026-06-30 17:44:26 +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,100 @@
|
||||
"""
|
||||
File: array.py
|
||||
Created Time: 2022-11-25
|
||||
Author: krahets (krahets@163.com)
|
||||
"""
|
||||
|
||||
import random
|
||||
|
||||
|
||||
def random_access(nums: list[int]) -> int:
|
||||
"""Случайный доступ к элементу"""
|
||||
# Случайным образом выбрать число из интервала [0, len(nums)-1]
|
||||
random_index = random.randint(0, len(nums) - 1)
|
||||
# Получить и вернуть случайный элемент
|
||||
random_num = nums[random_index]
|
||||
return random_num
|
||||
|
||||
|
||||
# Обратите внимание: list в Python — это динамический массив, его можно расширять напрямую
|
||||
# Для удобства обучения в этой функции list рассматривается как массив неизменяемой длины
|
||||
def extend(nums: list[int], enlarge: int) -> list[int]:
|
||||
"""Увеличить длину массива"""
|
||||
# Инициализировать массив увеличенной длины
|
||||
res = [0] * (len(nums) + enlarge)
|
||||
# Скопировать все элементы исходного массива в новый массив
|
||||
for i in range(len(nums)):
|
||||
res[i] = nums[i]
|
||||
# Вернуть новый массив после расширения
|
||||
return res
|
||||
|
||||
|
||||
def insert(nums: list[int], num: int, index: int):
|
||||
"""Вставить элемент num по индексу index в массив"""
|
||||
# Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад
|
||||
for i in range(len(nums) - 1, index, -1):
|
||||
nums[i] = nums[i - 1]
|
||||
# Присвоить num элементу по индексу index
|
||||
nums[index] = num
|
||||
|
||||
|
||||
def remove(nums: list[int], index: int):
|
||||
"""Удалить элемент по индексу index"""
|
||||
# Сдвинуть все элементы после индекса index на одну позицию вперед
|
||||
for i in range(index, len(nums) - 1):
|
||||
nums[i] = nums[i + 1]
|
||||
|
||||
|
||||
def traverse(nums: list[int]):
|
||||
"""Обход массива"""
|
||||
count = 0
|
||||
# Обход массива по индексам
|
||||
for i in range(len(nums)):
|
||||
count += nums[i]
|
||||
# Непосредственно обходить элементы массива
|
||||
for num in nums:
|
||||
count += num
|
||||
# Одновременно обходить индексы и элементы данных
|
||||
for i, num in enumerate(nums):
|
||||
count += nums[i]
|
||||
count += num
|
||||
|
||||
|
||||
def find(nums: list[int], target: int) -> int:
|
||||
"""Найти заданный элемент в массиве"""
|
||||
for i in range(len(nums)):
|
||||
if nums[i] == target:
|
||||
return i
|
||||
return -1
|
||||
|
||||
|
||||
"""Driver Code"""
|
||||
if __name__ == "__main__":
|
||||
# Инициализация массива
|
||||
arr = [0] * 5
|
||||
print("Массив arr =", arr)
|
||||
nums = [1, 3, 2, 5, 4]
|
||||
print("Массив nums =", nums)
|
||||
|
||||
# Случайный доступ
|
||||
random_num: int = random_access(nums)
|
||||
print("Случайный элемент из nums =", random_num)
|
||||
|
||||
# Расширение длины
|
||||
nums: list[int] = extend(nums, 3)
|
||||
print("После увеличения длины массива до 8 nums =", nums)
|
||||
|
||||
# Вставка элемента
|
||||
insert(nums, 6, 3)
|
||||
print("После вставки числа 6 по индексу 3 nums =", nums)
|
||||
|
||||
# Удаление элемента
|
||||
remove(nums, 2)
|
||||
print("После удаления элемента по индексу 2 nums =", nums)
|
||||
|
||||
# Обход массива
|
||||
traverse(nums)
|
||||
|
||||
# Поиск элемента
|
||||
index: int = find(nums, 3)
|
||||
print("Поиск элемента 3 в nums: индекс =", index)
|
||||
@@ -0,0 +1,85 @@
|
||||
"""
|
||||
File: linked_list.py
|
||||
Created Time: 2022-11-25
|
||||
Author: krahets (krahets@163.com)
|
||||
"""
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
sys.path.append(str(Path(__file__).parent.parent))
|
||||
from modules import ListNode, print_linked_list
|
||||
|
||||
|
||||
def insert(n0: ListNode, P: ListNode):
|
||||
"""Вставить узел P после узла n0 в связном списке"""
|
||||
n1 = n0.next
|
||||
P.next = n1
|
||||
n0.next = P
|
||||
|
||||
|
||||
def remove(n0: ListNode):
|
||||
"""Удалить первый узел после узла n0 в связном списке"""
|
||||
if not n0.next:
|
||||
return
|
||||
# n0 -> P -> n1
|
||||
P = n0.next
|
||||
n1 = P.next
|
||||
n0.next = n1
|
||||
|
||||
|
||||
def access(head: ListNode, index: int) -> ListNode | None:
|
||||
"""Доступ к узлу связного списка по индексу index"""
|
||||
for _ in range(index):
|
||||
if not head:
|
||||
return None
|
||||
head = head.next
|
||||
return head
|
||||
|
||||
|
||||
def find(head: ListNode, target: int) -> int:
|
||||
"""Найти в связном списке первый узел со значением target"""
|
||||
index = 0
|
||||
while head:
|
||||
if head.val == target:
|
||||
return index
|
||||
head = head.next
|
||||
index += 1
|
||||
return -1
|
||||
|
||||
|
||||
"""Driver Code"""
|
||||
if __name__ == "__main__":
|
||||
# Инициализация связного списка
|
||||
# Инициализация всех узлов
|
||||
n0 = ListNode(1)
|
||||
n1 = ListNode(3)
|
||||
n2 = ListNode(2)
|
||||
n3 = ListNode(5)
|
||||
n4 = ListNode(4)
|
||||
# Построить ссылки между узлами
|
||||
n0.next = n1
|
||||
n1.next = n2
|
||||
n2.next = n3
|
||||
n3.next = n4
|
||||
print("Исходный связный список")
|
||||
print_linked_list(n0)
|
||||
|
||||
# Вставка узла
|
||||
p = ListNode(0)
|
||||
insert(n0, p)
|
||||
print("Связный список после вставки узла")
|
||||
print_linked_list(n0)
|
||||
|
||||
# Удаление узла
|
||||
remove(n0)
|
||||
print("Связный список после удаления узла")
|
||||
print_linked_list(n0)
|
||||
|
||||
# Доступ к узлу
|
||||
node: ListNode = access(n0, 3)
|
||||
print("Значение узла по индексу 3 в связном списке = {}".format(node.val))
|
||||
|
||||
# Поиск узла
|
||||
index: int = find(n0, 2)
|
||||
print("Индекс узла со значением 2 в связном списке = {}".format(index))
|
||||
@@ -0,0 +1,56 @@
|
||||
"""
|
||||
File: list.py
|
||||
Created Time: 2022-11-25
|
||||
Author: krahets (krahets@163.com)
|
||||
"""
|
||||
|
||||
"""Driver Code"""
|
||||
if __name__ == "__main__":
|
||||
# Инициализация списка
|
||||
nums: list[int] = [1, 3, 2, 5, 4]
|
||||
print("\nСписок nums =", nums)
|
||||
|
||||
# Доступ к элементу
|
||||
x: int = nums[1]
|
||||
print("\nЭлемент по индексу 1: x =", x)
|
||||
|
||||
# Обновление элемента
|
||||
nums[1] = 0
|
||||
print("\nПосле обновления элемента по индексу 1 до 0 nums =", nums)
|
||||
|
||||
# Очистить список
|
||||
nums.clear()
|
||||
print("\nПосле очистки списка nums =", nums)
|
||||
|
||||
# Добавление элемента в конец
|
||||
nums.append(1)
|
||||
nums.append(3)
|
||||
nums.append(2)
|
||||
nums.append(5)
|
||||
nums.append(4)
|
||||
print("\nПосле добавления элементов nums =", nums)
|
||||
|
||||
# Вставка элемента в середину
|
||||
nums.insert(3, 6)
|
||||
print("\nПосле вставки числа 6 по индексу 3 nums =", nums)
|
||||
|
||||
# Удаление элемента
|
||||
nums.pop(3)
|
||||
print("\nПосле удаления элемента по индексу 3 nums =", nums)
|
||||
|
||||
# Обходить список по индексам
|
||||
count = 0
|
||||
for i in range(len(nums)):
|
||||
count += nums[i]
|
||||
# Непосредственно обходить элементы списка
|
||||
for num in nums:
|
||||
count += num
|
||||
|
||||
# Объединить два списка
|
||||
nums1 = [6, 8, 7, 10, 9]
|
||||
nums += nums1
|
||||
print("\nПосле конкатенации списка nums1 к nums nums =", nums)
|
||||
|
||||
# Отсортировать список
|
||||
nums.sort()
|
||||
print("\nПосле сортировки списка nums =", nums)
|
||||
@@ -0,0 +1,118 @@
|
||||
"""
|
||||
File: my_list.py
|
||||
Created Time: 2022-11-25
|
||||
Author: krahets (krahets@163.com)
|
||||
"""
|
||||
|
||||
|
||||
class MyList:
|
||||
"""Класс списка"""
|
||||
|
||||
def __init__(self):
|
||||
"""Конструктор"""
|
||||
self._capacity: int = 10 # Вместимость списка
|
||||
self._arr: list[int] = [0] * self._capacity # Массив (для хранения элементов списка)
|
||||
self._size: int = 0 # Длина списка (текущее число элементов)
|
||||
self._extend_ratio: int = 2 # Коэффициент увеличения списка при каждом расширении
|
||||
|
||||
def size(self) -> int:
|
||||
"""Получить длину списка (текущее число элементов)"""
|
||||
return self._size
|
||||
|
||||
def capacity(self) -> int:
|
||||
"""Получить вместимость списка"""
|
||||
return self._capacity
|
||||
|
||||
def get(self, index: int) -> int:
|
||||
"""Доступ к элементу"""
|
||||
# Если индекс выходит за границы, выбрасывается исключение; далее аналогично
|
||||
if index < 0 or index >= self._size:
|
||||
raise IndexError("индекс выходит за границы")
|
||||
return self._arr[index]
|
||||
|
||||
def set(self, num: int, index: int):
|
||||
"""Обновление элемента"""
|
||||
if index < 0 or index >= self._size:
|
||||
raise IndexError("индекс выходит за границы")
|
||||
self._arr[index] = num
|
||||
|
||||
def add(self, num: int):
|
||||
"""Добавление элемента в конец"""
|
||||
# При превышении вместимости по числу элементов запускается расширение
|
||||
if self.size() == self.capacity():
|
||||
self.extend_capacity()
|
||||
self._arr[self._size] = num
|
||||
self._size += 1
|
||||
|
||||
def insert(self, num: int, index: int):
|
||||
"""Вставка элемента в середину"""
|
||||
if index < 0 or index >= self._size:
|
||||
raise IndexError("индекс выходит за границы")
|
||||
# При превышении вместимости по числу элементов запускается расширение
|
||||
if self._size == self.capacity():
|
||||
self.extend_capacity()
|
||||
# Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад
|
||||
for j in range(self._size - 1, index - 1, -1):
|
||||
self._arr[j + 1] = self._arr[j]
|
||||
self._arr[index] = num
|
||||
# Обновить число элементов
|
||||
self._size += 1
|
||||
|
||||
def remove(self, index: int) -> int:
|
||||
"""Удаление элемента"""
|
||||
if index < 0 or index >= self._size:
|
||||
raise IndexError("индекс выходит за границы")
|
||||
num = self._arr[index]
|
||||
# Сдвинуть все элементы после индекса index на одну позицию вперед
|
||||
for j in range(index, self._size - 1):
|
||||
self._arr[j] = self._arr[j + 1]
|
||||
# Обновить число элементов
|
||||
self._size -= 1
|
||||
# Вернуть удаленный элемент
|
||||
return num
|
||||
|
||||
def extend_capacity(self):
|
||||
"""Расширение списка"""
|
||||
# Создать новый массив длиной в _extend_ratio раз больше исходного массива и скопировать в него исходный массив
|
||||
self._arr = self._arr + [0] * self.capacity() * (self._extend_ratio - 1)
|
||||
# Обновить вместимость списка
|
||||
self._capacity = len(self._arr)
|
||||
|
||||
def to_array(self) -> list[int]:
|
||||
"""Вернуть список фактической длины"""
|
||||
return self._arr[: self._size]
|
||||
|
||||
|
||||
"""Driver Code"""
|
||||
if __name__ == "__main__":
|
||||
# Инициализация списка
|
||||
nums = MyList()
|
||||
# Добавление элемента в конец
|
||||
nums.add(1)
|
||||
nums.add(3)
|
||||
nums.add(2)
|
||||
nums.add(5)
|
||||
nums.add(4)
|
||||
print(f"Список nums = {nums.to_array()}, вместимость = {nums.capacity()}, длина = {nums.size()}")
|
||||
|
||||
# Вставка элемента в середину
|
||||
nums.insert(6, index=3)
|
||||
print("После вставки числа 6 по индексу 3 nums =", nums.to_array())
|
||||
|
||||
# Удаление элемента
|
||||
nums.remove(3)
|
||||
print("После удаления элемента по индексу 3 nums =", nums.to_array())
|
||||
|
||||
# Доступ к элементу
|
||||
num = nums.get(1)
|
||||
print("Элемент по индексу 1: num =", num)
|
||||
|
||||
# Обновление элемента
|
||||
nums.set(0, 1)
|
||||
print("После обновления элемента по индексу 1 до 0 nums =", nums.to_array())
|
||||
|
||||
# Проверка механизма расширения
|
||||
for i in range(10):
|
||||
# При i = 5 длина списка превысит его вместимость, и в этот момент сработает механизм расширения
|
||||
nums.add(i)
|
||||
print(f"Список nums после увеличения вместимости = {nums.to_array()}, вместимость = {nums.capacity()}, длина = {nums.size()}")
|
||||
Reference in New Issue
Block a user