Перейти к основному содержимому

Практика: Массивы, слайсы и карты


Онлайн редактор кода для Go

Здесь вы можете попробовать свои силы в программировании на языке Go. Для этого мы предоставляем вам онлайн редактор кода, в котором вы можете написать свой код и запустить его.

❗️ При обновлении страницы код пропадёт, по этому, сохраните свой код куда-нибудь, если он важный.

Задание 1: Уникальные элементы с сохранением порядка

Задание 1: Очистка дубликатов

Создай слайс с повторяющимися элементами. Напиши функцию, которая возвращает новый слайс без дубликатов, сохраняя порядок первого появления элементов. Выведи исходный и очищенный слайс + количество уникальных элементов.


💡 Подсказка

Используй map для отслеживания уже встреченных элементов.

Проходи по исходному слайсу и добавляй в результат только те элементы, которых ещё нет в map.

Сохрани порядок — добавляй элементы в том порядке, в котором они впервые появляются.

После решения основного теста проверь на дополнительных примерах.

Задание 2: Contains Duplicate (Есть ли дубликаты)

Задание 2: Contains Duplicate (L)

Дан слайс целых чисел nums. Выведи true, если в нём есть хотя бы один дубликат, иначе false.


💡 Подсказка

Самый простой способ — использовать map или множество (map[T]struct).

Проходи по слайсу и проверяй, встречалось ли число раньше.

Если слайс пустой или из одного элемента — сразу false.

Проверь свой код на дополнительных примерах после решения основного.

Задание 3: Сортировка выбором с визуализацией

Задание 3: Сортировка выбором

Создай слайс чисел. Реализуй сортировку выбором: на каждом шаге находи минимальный элемент в неотсортированной части и меняй его местами с первым неотсортированным. После каждого прохода выводи текущий слайс в виде баров из звёздочек.


💡 Подсказка

На каждом проходе (от 0 до len-1) ищи минимальный элемент в оставшейся части и меняй местами.

Для визуализации: для каждого числа выводи соответствующее количество звёздочек (*).

Выводи состояние после каждого прохода и финальный отсортированный слайс.

Проверь на дополнительных примерах.

Задание 4: Объединение карт с приоритетом

Задание 4: Объединение карт

Создай две карты map[string]int. Напиши функцию, которая объединяет их в одну: если ключ есть в обеих — берётся значение из второй карты. Выведи все три карты.


💡 Подсказка

Создай новую карту.

Сначала скопируй все элементы из первой карты.

Затем пройди по второй карте и добавь/перезапиши значения — они имеют приоритет.

Выведи все три карты для наглядности (можно в цикле for range).

Задание 5: Простое множество (Set)

Задание 5: Множество на основе map

Реализуй простое множество целых чисел на основе map[int]struct{}. Добавь операции: добавление, удаление, проверка наличия и вывод всех элементов (в любом порядке).


💡 Подсказка

Используй тип map[int]struct — struct занимает 0 байт.

Добавление: m[value] = struct

Удаление: delete(m, value)

Проверка: _, ok := m[value]

Для вывода собери ключи в слайс.

Задание 6: Мини-LRU кэш

Задание 6: LRU-кэш на слайсе и карте

Реализуй простой LRU-кэш фиксированного размера (4 элемента). При добавлении: если элемент уже есть — перемести в начало, если кэш полон — удали самый старый. Используй слайс для порядка и map для быстрого поиска.


💡 Подсказка

Используй слайс для хранения порядка (недавно использованные в начале).

Map[string]int хранит индекс элемента в слайсе для быстрого поиска.

При добавлении существующего — удали старое положение и добавь в начало.

При переполнении — удали последний элемент из слайса и из map.

Задание 7: Инверсия топ-листа

Задание 7: Инверсия топ-листа

Захардкодь карту 'игра → рейтинг'. Напиши функцию, которая инвертирует её: рейтинг → список игр с таким рейтингом. Выведи топ-лист по убыванию рейтинга (от самого высокого к низкому).


💡 Подсказка

Создай новую карту, где ключ — рейтинг (int), значение — слайс строк с названиями игр.

Проходи по исходной карте и добавляй каждую игру в соответствующий список рейтинга.

Для вывода по убыванию собери все рейтинги в слайс, отсортируй по убыванию и выводи от большего к меньшему.

Выдели лидеров с максимальным рейтингом (можно отдельной строкой).

Задание 8: Roman to Integer (Римское число в десятичное)

Задание 8: Roman to Integer (L)

Дана строка s — римское число (гарантируется корректность). Преобразуй его в обычное целое число (int) и выведи результат с пояснением.


💡 Подсказка

Римские цифры: I=1, V=5, X=10, L=50, C=100, D=500, M=1000.

Вычитание происходит, когда меньшая цифра стоит перед большей (IV=4, IX=9, XL=40 и т.д.).

Проходи по строке слева направо: добавляй значение текущей цифры, но если текущая меньше следующей — вычитай её.

В конце добавь значение последней цифры.

Можно использовать map[rune]int для значений символов.

Проверь свой код на дополнительных примерах после решения основного.

Дополнительные материалы

  • Попробуй реализовать операции над слайсами (фильтр, мап, редукция) самостоятельно
  • Поиграйся с ёмкостью (cap) при append — наблюдай, как она растёт
  • Экспериментируй с размером кэша в LRU
Совет

Слайсы и карты — основные инструменты в Go. Освой их глубоко — и ты будешь писать эффективный и чистый код.

Следующий урок

Структуры, методы и интерфейсы.