Метод, возвращающий массив без повторяющихся элементов в исходном порядке без LINQ

Храните встреченные числа в HashSet, а первые вхождения добавляйте в List. Это сохраняет порядок исходного массива и работает за ожидаемое O(n).

Короткий ответ

Что ответить на собеседовании

Храните встреченные числа в HashSet, а первые вхождения добавляйте в List. Это сохраняет порядок исходного массива и работает за ожидаемое O(n).

Подробный разбор

Ответ с пояснениями

Условие

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

int[] Distinct(int[] source)
// [1,2,5,3,3,2] → [1,2,5,3]

Ответ

Храните встреченные числа в HashSet, а первые вхождения добавляйте в List. Это сохраняет порядок исходного массива и работает за ожидаемое O(n).

static int[] Distinct(int[] source)
{
    ArgumentNullException.ThrowIfNull(source);
    var seen = new HashSet<int>();
    var result = new List<int>();
    foreach (int value in source)
        if (seen.Add(value)) result.Add(value);
    return result.ToArray();
}

Для [1,2,5,3,3,2] результат — [1,2,5,3]. Add возвращает true только при первом появлении числа. Дополнительная память O(k), где k — количество разных значений. Порядок берётся из List, а не из перечисления HashSet.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее