Храните встреченные числа в HashSet, а первые вхождения добавляйте в List. Это сохраняет порядок исходного массива и работает за ожидаемое O(n).
Метод, возвращающий массив без повторяющихся элементов в исходном порядке без LINQ
Храните встреченные числа в 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.