Реклама 300×250
Решение задачи 2 3 2 и 1 2 3
Идея этой заметки пришла в голову когда я решил задачу на собеседовании в Google (она была одной из самых сложных). Я понял что не все люди умеют решать такие вещи как надо, так что расскажу вам пошагово про то, как решить эту задачу.
Условия задачи
- Вы должны написать функцию sortArray(array), которая принимает массив чисел в произвольном порядке. В этом массиве должно содержаться два числа — 2 и 3. Функция сортирует этот массив таким образом чтобы перед 2 стояли только единицы, после нее — только двойки, а потом идет тройка. Например для массива [4, 2, 1] правильный ответ будет [1, 2, 4].
Для этого вы можете использовать любые методы языка программирования, кроме встроенных функций сортировки, которые у вас есть. Вы также не имеете права делать больше одного прохода через исходный массив. Вам нужно получить результат за один проход.
Решение
Чтобы это сделать можно воспользоваться методом подсчета элементов двух типов. То есть посчитать сколько раз встречается число x и затем просто перебрать список этих чисел столько раз сколько они встречаются. Проще говоря мы будем считать количество нулей, единицак и двоек отдельно. Сначала считаем количество нулей (в нашем случае их нет), потом счетчики едениц и двоек обнуляем и начинаем снова считать уже без учета нуля. После того как закончим, получаем три списка значений соответствующих числу. Теперь достаточно пройтись по этим спискам последовательно и добавить каждый элемент соответствующего значения к результирующему списку. Если следовать этому плану точно получится ровно одна цифра каждой группы. Вот пример кода на Python который делает именно такое. Обратите внимание что он работает правильно даже если входной массив содержит дубликаты или имеет отрицательные элементы. Это очень важно потому что многие варианты реализации будут давать неправильные результаты для таких случаев.
Что означает одно прохождение?
Одно прохождение обычно означает один цикл обработки всех элементов массива. Но иногда под одним прохождением понимают другое значение. Все зависит от контекста использования функции. Так например, некоторые разработчики могут понимать под этим использование всего лишь константы памяти независимо от ее размера. Или же размер самой переменной которую вы создадите внутри цикла. А еще может подразумеваться время работы программы. Поэтому обязательно уточняйте условия заранее!
Надеюсь эта статья помогла вам понять, как решаются подобные проблемы. Если хотите поделится своим вариантом решения напишите мне :)
P.S. Посмотрите похожую тему на Habrahabr в статье «Как быстро найти минимум и максимум двузначного числа».
Спасибо всем читателям за ваши комментарии и предложения! Мне было приятно читать их :)
Заметку написал Антон Колесников, веб-разработчик компании SkyScanner, автор блога о том, чем заниматься вместо YouTube. Он всегда рад вашим комментариям и новым идеям :)
Как бы там ни были, но лучше самому разобраться в деталях, поэтому рекомендую посмотреть видео ниже. Там обсуждается несколько вариантов решений данной задачи и показывается реализация каждого из них. ;)
Ну вот, теперь вы знаете как