22 мая 2012 г.

Поиск дубликатов

На одном из собеседований на работу задали мне задачу, несложную такую задачу, но сразу код я написать не смог. Написал уже дома.
Итак задача: есть у вас массив чисел (предположим целочисленный массив). Все числа в нем разные, но нектороые числа имеют дубликаты. Как найти эти числа?

Интуитивно я понял, что для решения этой задачи необходимо использовать LINQ. И вот кусок кода, решающий эту задачу:
int[] array = new int[]{1,2,3,4,5,6,7,8,9,0,4};
var result = array
    // группируем по ключу.
    // в данном случае ключ
    // и есть наши числа
    .GroupBy(key => key)
    // выбираем те группы,
    // число элементов в которых больше 1
    .Where(gr => gr.Count() > 1)
    // выбираем ключи (числа).
    // определить их местоположение - дело техники
    .Select(gr => gr.Key);

foreach (var item in result)
{
    Console.WriteLine(item);
}
Кому нравится LINQ в виде запроса можно сделать так:
var result = from num in array
             group num by num into newgroup
             where newgroup.Count() > 1
             select newgroup.Key;

3 комментария :

Unknown комментирует...

Мне кажется, что можно еще по аналогу с решетом Эротосфена (для поиска простых чисел) сделать.

Т.е. берем два вложенных цикла берем первый элемент и выкидываем все его повторы из массива, потом второй элемент и т.д.
Понимаю, что тупой алгоритм, зато простой.

test комментирует...

Можно. Да мало ли их можно придумать этих алгоритмов? Тьму! Тут вся сложность в том, что с такой задачей мало кто сталкивается в реальности. А тут тебя просят ее решить, причем сразу и на глазах у восхищенных зрителей ;) Я тогда немного растерялся. Объяснил ответ на пальцах, но код написал уже дома.
И еще одно уточнение: ЭрАтосфен а не ЭрОтосфен. А то прямо неприлично как-то звучит ;)

Unknown комментирует...

Ага, все по Фрейду.
Я на собеседовании люблю задавать задачки на логику, мне думается, что они достаточно объективны.
Интересно как человек думает.

У нас препод был такой, ему в решении надо слегка ошибиться чтобы он это заметил и ты потом радостно ему сообщаешь как же на самом деле надо делать.

Забавно, но похожий фокус со мной вполне прокатил.