Как найти числа и количество их повторений в массиве чисел
Что проверяют
Базовое владение коллекциями Swift и умение оценить сложность. Решение со словарём ждут почти сразу, дальше просят вывести результат в определённом порядке или найти самое частое число.
Как отвечать
Каркас это один проход со словарём: O(n) по времени и O(k) по памяти, где k это число различных значений. Способы записи:
- subscript с дефолтом:
var counts: [Int: Int] = [:], затемfor n in numbers { counts[n, default: 0] += 1 }. Параметрdefault:избавляет от проверки наnilи меняет значение на месте; reduce(into:):numbers.reduce(into: [:]) { $0[$1, default: 0] += 1 }. Версияinto:мутирует аккумулятор, а не создаёт новый словарь на каждом шаге, поэтому остаётся линейной;Dictionary(_:uniquingKeysWith:):Dictionary(numbers.map { ($0, 1) }, uniquingKeysWith: +), короткий однострочник;NSCountedSet: класс из Foundation, частоту возвращаетcount(for:). Работает сAny, поэтому в Swift-коде уступает словарю по типобезопасности.
Дальше скажите про порядок. Dictionary не упорядочен, а хэширование в Swift засевается случайно при каждом запуске процесса, так что for (k, v) in counts печатает пары в разном порядке. Для вывода сортируйте: counts.sorted { $0.key < $1.key } или по убыванию частоты sorted { $0.value > $1.value }, это уже O(k log k). Самое частое число даёт counts.max { $0.value < $1.value }, результат опциональный, пустой массив нужно обработать.
Альтернатива без словаря: отсортировать массив и считать подряд идущие одинаковые элементы. Это O(n log n), зато без дополнительной памяти, если сортировать на месте.
Где спотыкаются
Пишут вложенный цикл или numbers.filter { $0 == n }.count для каждого элемента. Это O(n²), и на массиве в сто тысяч элементов разница заметна даже без замеров.
Используют reduce([:]) без into: и возвращают из замыкания изменённую копию словаря. Код выглядит функционально, но рискует копировать словарь на каждой итерации и стать квадратичным.
Обещают вывод «в порядке появления», забыв, что словарь его не хранит. Для такого требования нужен отдельный массив ключей в порядке первого появления или повторный проход по исходному массиву.