На одном из собеседований на работу задали мне задачу, несложную такую задачу, но сразу код я написать не смог. Написал уже дома.
Итак задача: есть у вас массив чисел (предположим целочисленный массив). Все числа в нем разные, но нектороые числа имеют дубликаты. Как найти эти числа?Интуитивно я понял, что для решения этой задачи необходимо использовать 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 комментария :
Мне кажется, что можно еще по аналогу с решетом Эротосфена (для поиска простых чисел) сделать.
Т.е. берем два вложенных цикла берем первый элемент и выкидываем все его повторы из массива, потом второй элемент и т.д.
Понимаю, что тупой алгоритм, зато простой.
Можно. Да мало ли их можно придумать этих алгоритмов? Тьму! Тут вся сложность в том, что с такой задачей мало кто сталкивается в реальности. А тут тебя просят ее решить, причем сразу и на глазах у восхищенных зрителей ;) Я тогда немного растерялся. Объяснил ответ на пальцах, но код написал уже дома.
И еще одно уточнение: ЭрАтосфен а не ЭрОтосфен. А то прямо неприлично как-то звучит ;)
Ага, все по Фрейду.
Я на собеседовании люблю задавать задачки на логику, мне думается, что они достаточно объективны.
Интересно как человек думает.
У нас препод был такой, ему в решении надо слегка ошибиться чтобы он это заметил и ты потом радостно ему сообщаешь как же на самом деле надо делать.
Забавно, но похожий фокус со мной вполне прокатил.
Отправить комментарий