Убрать из массива дубликаты без linq

Задача: реализовать метод Filter, который должен возвращать входной массив, в котором удалены элементы, которые встречаются более одного раза.

Значения в массиве должны следовать в том порядке, в котором они следуют в оригинальном массиве.

Если в массиве встречаются повторяющиеся значения, то они ВСЕ значения должны быть удалены.

Метод должен выбрасывать исключение ArgumentNullException в случае, если в метод передали null.

В решении разрешается использовать только конструкции языка. Использовать LINQ запрещено.

Сделал следующим образом, считал данные из исходного массива в HashSet<int> и числа которые повторяются добавил в List<int> после этого с помощью set.ExceptWith(list) убрал числа у которых были дубликаты.

public static int[] Filter(int[] source)
{
    if(source == null)
        throw new ArgumentNullException();

    var set = new HashSet<int>();
    var list = new List<int>();

    for (int i = 0; i < source.Length; i++)
    {
        if(!set.Add(source[i]))
            list.Add(source[i]);

    }

    set.ExceptWith(list);
    int[] newarray = new int[set.Count];
    set.CopyTo(newarray);
    return newarray;
}

Можно ли реализовать без помощи дополнительных структур данных? Только юзая массивы


Ответы (1 шт):

Автор решения: A K

Как-то так:

void Main()
{
    var source = new[] {1, 2, 3, 4, 3, 4,5};
    Filter(source).Dump();
}

// Define other methods and classes here

public static int[] Filter(int[] source)
{
    if (source == null)
        throw new ArgumentNullException(nameof(source));


    var result = new List<int>();

    for (int i = 0; i < source.Length; i++)
    {
        var currentElement = source[i];

        if (!source.HasDuplicateFor(currentElement))
            result.Add(currentElement);
    }

    return result.ToArray();
}

public static class MyExt
{
    public static bool HasDuplicateFor(this int[] source, int needle)
    {
        var counter = 0;
        for (int i = 0; i < source.Length; i++)
        {
            if (source[i] == needle)
                counter++;
        }

        return counter > 1;
    }
}

введите сюда описание изображения

Вроде ничего Linq-шного не использовал, по факту HasDuplicateFor - это .Count из linq, просто записанный в классическом цикле for.

→ Ссылка