mirror of
https://github.com/krahets/hello-algo.git
synced 2026-08-12 03:40: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,108 @@
|
||||
=begin
|
||||
File: array.rb
|
||||
Created Time: 2024-03-18
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
# ## Случайный доступ к элементу ###
|
||||
def random_access(nums)
|
||||
# Случайным образом выбрать число из интервала [0, nums.length)
|
||||
random_index = Random.rand(0...nums.length)
|
||||
|
||||
# Получить и вернуть случайный элемент
|
||||
nums[random_index]
|
||||
end
|
||||
|
||||
|
||||
# ## Увеличить длину массива ###
|
||||
# Обратите внимание: Array в Ruby является динамическим массивом и может быть расширен напрямую
|
||||
# Для удобства обучения эта функция рассматривает Array как массив неизменяемой длины
|
||||
def extend(nums, enlarge)
|
||||
# Инициализировать массив увеличенной длины
|
||||
res = Array.new(nums.length + enlarge, 0)
|
||||
|
||||
# Скопировать все элементы исходного массива в новый массив
|
||||
for i in 0...nums.length
|
||||
res[i] = nums[i]
|
||||
end
|
||||
|
||||
# Вернуть новый массив после расширения
|
||||
res
|
||||
end
|
||||
|
||||
# ## Вставка элемента num по индексу index в массив ###
|
||||
def insert(nums, num, index)
|
||||
# Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад
|
||||
for i in (nums.length - 1).downto(index + 1)
|
||||
nums[i] = nums[i - 1]
|
||||
end
|
||||
|
||||
# Присвоить num элементу по индексу index
|
||||
nums[index] = num
|
||||
end
|
||||
|
||||
|
||||
# ## Удаление элемента по индексу index ###
|
||||
def remove(nums, index)
|
||||
# Сдвинуть все элементы после индекса index на одну позицию вперед
|
||||
for i in index...(nums.length - 1)
|
||||
nums[i] = nums[i + 1]
|
||||
end
|
||||
end
|
||||
|
||||
# ## Обход массива ###
|
||||
def traverse(nums)
|
||||
count = 0
|
||||
|
||||
# Обход массива по индексам
|
||||
for i in 0...nums.length
|
||||
count += nums[i]
|
||||
end
|
||||
|
||||
# Непосредственно обходить элементы массива
|
||||
for num in nums
|
||||
count += num
|
||||
end
|
||||
end
|
||||
|
||||
# ## Поиск заданного элемента в массиве ###
|
||||
def find(nums, target)
|
||||
for i in 0...nums.length
|
||||
return i if nums[i] == target
|
||||
end
|
||||
|
||||
-1
|
||||
end
|
||||
|
||||
|
||||
### Driver Code ###
|
||||
if __FILE__ == $0
|
||||
# Инициализация массива
|
||||
arr = Array.new(5, 0)
|
||||
puts "Массив arr = #{arr}"
|
||||
nums = [1, 3, 2, 5, 4]
|
||||
puts "Массив nums = #{nums}"
|
||||
|
||||
# Случайный доступ
|
||||
random_num = random_access(nums)
|
||||
puts "Случайный элемент из nums = #{random_num}"
|
||||
|
||||
# Расширение длины
|
||||
nums = extend(nums, 3)
|
||||
puts "После увеличения длины массива до 8 nums = #{nums}"
|
||||
|
||||
# Вставка элемента
|
||||
insert(nums, 6, 3)
|
||||
puts "После вставки числа 6 по индексу 3 nums = #{nums}"
|
||||
|
||||
# Удаление элемента
|
||||
remove(nums, 2)
|
||||
puts "После удаления элемента по индексу 2 nums = #{nums}"
|
||||
|
||||
# Обход массива
|
||||
traverse(nums)
|
||||
|
||||
# Поиск элемента
|
||||
index = find(nums, 3)
|
||||
puts "Поиск элемента 3 в nums: индекс = #{index}"
|
||||
end
|
||||
@@ -0,0 +1,83 @@
|
||||
=begin
|
||||
File: linked_list.rb
|
||||
Created Time: 2024-03-18
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
require_relative '../utils/list_node'
|
||||
require_relative '../utils/print_util'
|
||||
|
||||
# ## Вставка узла _p после узла n0 в связном списке ###
|
||||
# В Ruby `p` — встроенная функция, а `P` — константа, поэтому вместо этого можно использовать `_p`
|
||||
def insert(n0, _p)
|
||||
n1 = n0.next
|
||||
_p.next = n1
|
||||
n0.next = _p
|
||||
end
|
||||
|
||||
# ## Удаление первого узла после узла n0 в связном списке ###
|
||||
def remove(n0)
|
||||
return if n0.next.nil?
|
||||
|
||||
# n0 -> remove_node -> n1
|
||||
remove_node = n0.next
|
||||
n1 = remove_node.next
|
||||
n0.next = n1
|
||||
end
|
||||
|
||||
# ## Доступ к узлу связного списка по индексу index ###
|
||||
def access(head, index)
|
||||
for i in 0...index
|
||||
return nil if head.nil?
|
||||
head = head.next
|
||||
end
|
||||
|
||||
head
|
||||
end
|
||||
|
||||
# ## Поиск первого узла со значением target в связном списке ###
|
||||
def find(head, target)
|
||||
index = 0
|
||||
while head
|
||||
return index if head.val == target
|
||||
head = head.next
|
||||
index += 1
|
||||
end
|
||||
|
||||
-1
|
||||
end
|
||||
|
||||
### Driver Code ###
|
||||
if __FILE__ == $0
|
||||
# Инициализация связного списка
|
||||
# Инициализация всех узлов
|
||||
n0 = ListNode.new(1)
|
||||
n1 = ListNode.new(3)
|
||||
n2 = ListNode.new(2)
|
||||
n3 = ListNode.new(5)
|
||||
n4 = ListNode.new(4)
|
||||
# Построить ссылки между узлами
|
||||
n0.next = n1
|
||||
n1.next = n2
|
||||
n2.next = n3
|
||||
n3.next = n4
|
||||
puts "Исходный связный список"
|
||||
print_linked_list(n0)
|
||||
|
||||
# Вставка узла
|
||||
insert(n0, ListNode.new(0))
|
||||
print_linked_list n0
|
||||
|
||||
# Удаление узла
|
||||
remove(n0)
|
||||
puts "Связный список после удаления узла"
|
||||
print_linked_list(n0)
|
||||
|
||||
# Доступ к узлу
|
||||
node = access(n0, 3)
|
||||
puts "Значение узла по индексу 3 в связном списке = #{node.val}"
|
||||
|
||||
# Поиск узла
|
||||
index = find(n0, 2)
|
||||
puts "Индекс узла со значением 2 в связном списке = #{index}"
|
||||
end
|
||||
@@ -0,0 +1,60 @@
|
||||
=begin
|
||||
File: list.rb
|
||||
Created Time: 2024-03-18
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
### Driver Code ###
|
||||
if __FILE__ == $0
|
||||
# Инициализация списка
|
||||
nums = [1, 3, 2, 5, 4]
|
||||
puts "Список nums = #{nums}"
|
||||
|
||||
# Доступ к элементу
|
||||
num = nums[1]
|
||||
puts "Элемент по индексу 1: num = #{num}"
|
||||
|
||||
# Обновление элемента
|
||||
nums[1] = 0
|
||||
puts "После обновления элемента по индексу 1 до 0 nums = #{nums}"
|
||||
|
||||
# Очистить список
|
||||
nums.clear
|
||||
puts "После очистки списка nums = #{nums}"
|
||||
|
||||
# Добавление элемента в конец
|
||||
nums << 1
|
||||
nums << 3
|
||||
nums << 2
|
||||
nums << 5
|
||||
nums << 4
|
||||
puts "После добавления элементов nums = #{nums}"
|
||||
|
||||
# Вставка элемента в середину
|
||||
nums.insert(3, 6)
|
||||
puts "После вставки элемента 6 по индексу 3 nums = #{nums}"
|
||||
|
||||
# Удаление элемента
|
||||
nums.delete_at(3)
|
||||
puts "После удаления элемента по индексу 3 nums = #{nums}"
|
||||
|
||||
# Обходить список по индексам
|
||||
count = 0
|
||||
for i in 0...nums.length
|
||||
count += nums[i]
|
||||
end
|
||||
|
||||
# Непосредственно обходить элементы списка
|
||||
count = 0
|
||||
nums.each do |x|
|
||||
count += x
|
||||
end
|
||||
|
||||
# Объединить два списка
|
||||
nums1 = [6, 8, 7, 10, 9]
|
||||
nums += nums1
|
||||
puts "После конкатенации списка nums1 к nums nums = #{nums}"
|
||||
|
||||
nums = nums.sort { |a, b| a <=> b }
|
||||
puts "После сортировки списка nums = #{nums}"
|
||||
end
|
||||
@@ -0,0 +1,132 @@
|
||||
=begin
|
||||
File: my_list.rb
|
||||
Created Time: 2024-03-18
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
# ## Класс списка ###
|
||||
class MyList
|
||||
attr_reader :size # Получить длину списка (текущее число элементов)
|
||||
attr_reader :capacity # Получить вместимость списка
|
||||
|
||||
# ## Конструктор ###
|
||||
def initialize
|
||||
@capacity = 10
|
||||
@size = 0
|
||||
@extend_ratio = 2
|
||||
@arr = Array.new(capacity)
|
||||
end
|
||||
|
||||
# ## Доступ к элементу ###
|
||||
def get(index)
|
||||
# Если индекс выходит за границы, выбрасывается исключение; далее аналогично
|
||||
raise IndexError, "индекс выходит за границы" if index < 0 || index >= size
|
||||
@arr[index]
|
||||
end
|
||||
|
||||
# ## Доступ к элементу ###
|
||||
def set(index, num)
|
||||
raise IndexError, "индекс выходит за границы" if index < 0 || index >= size
|
||||
@arr[index] = num
|
||||
end
|
||||
|
||||
# ## Добавление элемента в конец ###
|
||||
def add(num)
|
||||
# При превышении вместимости по числу элементов запускается расширение
|
||||
extend_capacity if size == capacity
|
||||
@arr[size] = num
|
||||
|
||||
# Обновить число элементов
|
||||
@size += 1
|
||||
end
|
||||
|
||||
# ## Вставка элемента в середину ###
|
||||
def insert(index, num)
|
||||
raise IndexError, "индекс выходит за границы" if index < 0 || index >= size
|
||||
|
||||
# При превышении вместимости по числу элементов запускается расширение
|
||||
extend_capacity if size == capacity
|
||||
|
||||
# Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад
|
||||
for j in (size - 1).downto(index)
|
||||
@arr[j + 1] = @arr[j]
|
||||
end
|
||||
@arr[index] = num
|
||||
|
||||
# Обновить число элементов
|
||||
@size += 1
|
||||
end
|
||||
|
||||
# ## Удаление элемента ###
|
||||
def remove(index)
|
||||
raise IndexError, "индекс выходит за границы" if index < 0 || index >= size
|
||||
num = @arr[index]
|
||||
|
||||
# Сдвинуть все элементы после индекса index на одну позицию вперед
|
||||
for j in index...size
|
||||
@arr[j] = @arr[j + 1]
|
||||
end
|
||||
|
||||
# Обновить число элементов
|
||||
@size -= 1
|
||||
|
||||
# Вернуть удаленный элемент
|
||||
num
|
||||
end
|
||||
|
||||
# ## Расширение списка ###
|
||||
def extend_capacity
|
||||
# Создать новый массив длиной в extend_ratio раз больше исходного и скопировать в него исходный массив
|
||||
arr = @arr.dup + Array.new(capacity * (@extend_ratio - 1))
|
||||
# Обновить вместимость списка
|
||||
@capacity = arr.length
|
||||
end
|
||||
|
||||
# ## Преобразование списка в массив ###
|
||||
def to_array
|
||||
sz = size
|
||||
# Преобразовывать только элементы списка в пределах фактической длины
|
||||
arr = Array.new(sz)
|
||||
for i in 0...sz
|
||||
arr[i] = get(i)
|
||||
end
|
||||
arr
|
||||
end
|
||||
end
|
||||
|
||||
### Driver Code ###
|
||||
if __FILE__ == $0
|
||||
# Инициализация списка
|
||||
nums = MyList.new
|
||||
|
||||
# Добавление элемента в конец
|
||||
nums.add(1)
|
||||
nums.add(3)
|
||||
nums.add(2)
|
||||
nums.add(5)
|
||||
nums.add(4)
|
||||
puts "Список nums = #{nums.to_array}, емкость = #{nums.capacity}, длина = #{nums.size}"
|
||||
|
||||
# Вставка элемента в середину
|
||||
nums.insert(3, 6)
|
||||
puts "После вставки числа 6 по индексу 3 nums = #{nums.to_array}"
|
||||
|
||||
# Удаление элемента
|
||||
nums.remove(3)
|
||||
puts "После удаления элемента по индексу 3 nums = #{nums.to_array}"
|
||||
|
||||
# Доступ к элементу
|
||||
num = nums.get(1)
|
||||
puts "Элемент по индексу 1: num = #{num}"
|
||||
|
||||
# Обновление элемента
|
||||
nums.set(1, 0)
|
||||
puts "После обновления элемента по индексу 1 до 0 nums = #{nums.to_array}"
|
||||
|
||||
# Проверка механизма расширения
|
||||
for i in 0...10
|
||||
# При i = 5 длина списка превысит его вместимость, и в этот момент сработает механизм расширения
|
||||
nums.add(i)
|
||||
end
|
||||
puts "После расширения список nums = #{nums.to_array}, емкость = #{nums.capacity}, длина = #{nums.size}"
|
||||
end
|
||||
Reference in New Issue
Block a user