Я просто разбомбил интервью и почти не продвинулся в вопросе об интервью. Кто-нибудь может дать мне знать, как это сделать? Я пытался искать в Интернете, но ничего не смог найти:
По заданному номеру найдите следующее более высокое число, которое имеет тот же набор цифр, что и исходное число. Например: дано 38276, возвращено 38627
Я хотел начать с поиска индекса первой цифры (справа), который был меньше цифры. Затем я поворачивал последние цифры в подмножестве так, чтобы это было следующее наибольшее число, состоящее из тех же цифр, но застрявшее.
Интервьюер также предложил попробовать поменять цифры по одной за раз, но я не мог понять алгоритм и просто смотрел на экран в течение 20-30 минут. Само собой разумеется, я думаю, что мне придется продолжить поиски работы.
редактировать: для чего он стоит, меня пригласили на следующий раунд интервью
next_permutation
;-)Ответы:
Вы можете сделать это в
O(n)
(гдеn
число цифр) следующим образом:Начиная справа, вы найдете первую пару цифр, такую, что левая цифра будет меньше правой цифры. Давайте обратимся к левой цифре "цифра-х". Найдите наименьшее число больше цифры-x справа от цифры-x и поместите его сразу слева от цифры-x. Наконец, сортируйте оставшиеся цифры в порядке возрастания - поскольку они уже были в порядке убывания, все, что вам нужно сделать, это перевернуть их (за исключением цифры-x, которая может быть размещена в правильном месте в
O(n)
) .Пример прояснит это:
Доказательство правильности:
Давайте использовать заглавные буквы для определения цифр-строк и строчные буквы для цифр. Синтаксис
AB
означает «объединение строкA
иB
» .<
это лексикографический порядок, который совпадает с целочисленным порядком, когда строки цифр имеют одинаковую длину.Наш оригинальный номер N имеет форму
AxB
, гдеx
это одна цифра иB
сортируется по убыванию.Число, найденное нашим алгоритмом, - это
AyC
гдеy ∈ B
наименьшая цифра> x
(она должна существовать в зависимости отx
выбранного пути , см. Выше) иC
сортируется по возрастанию.Предположим, что есть какое-то число (с использованием тех же цифр)
N'
, чтоAxB < N' < AyC
.N'
должен начинаться с,A
иначе он не может попасть между ними, поэтому мы можем записать это в формеAzD
. Теперь наше неравенствоAxB < AzD < AyC
равнозначно тому, чтоxB < zD < yC
все три строки цифр содержат одинаковые цифры.Для того чтобы это было правдой, мы должны иметь
x <= z <= y
. Посколькуy
это самая маленькая цифра> x
,z
не может быть между ними, так что либоz = x
илиz = y
. Sayz = x
. Тогда наше неравенство естьxB < xD < yC
, что означает,B < D
где обаB
иD
имеют одинаковые цифры. Однако, В отсортированный по убыванию, так что не не строка с этих цифр больше , чем это. Таким образом, мы не можем иметьB < D
. Следуя тем же шагам, мы видим, что еслиz = y
не можемD < C
.Следовательно,
N'
не может существовать, что означает, что наш алгоритм правильно находит следующее наибольшее число.источник
9 832
затем отсортируйте все вправо от 9:9238
Почти идентичная проблема появилась как проблема Code Jam и имеет решение здесь:
http://code.google.com/codejam/contest/dashboard?c=186264#s=a&a=1
Вот краткое описание метода на примере:
A. Разделите последовательность цифр на две части, чтобы правая часть была максимально длинной, оставаясь в порядке убывания:
(Если все число в порядке убывания, большее число не может быть сделано без добавления цифр.)
B.1. Выберите последнюю цифру первой последовательности:
БИ 2. Найдите наименьшую цифру во второй последовательности, которая больше ее:
В.3. Поменяйте их местами:
C. Сортировка второй последовательности в порядке возрастания:
D. Готово!
источник
Вот компактное (но частично грубое) решение в Python
В C ++ вы можете сделать перестановки следующим образом: https://stackoverflow.com/a/9243091/1149664 (это тот же алгоритм, что и в itertools)
Вот реализация верхнего ответа, описанного Weeble и BlueRaja (другие ответы). Я сомневаюсь, что есть что-то лучше.
источник
type 'map' has no len()
. Я бы просто изменил 2-ю строку наiis=list(map(int,str(ii)))
. И кто-нибудь может объяснитьif i == 0: return ii
строку, пожалуйста? Почему это работает с вводом, таким как 111 или 531? Спасибо.i == len(iis)
.Как минимум, вот пара примеров решений на основе грубой силы на основе String, которые вы должны были бы придумать прямо из головы:
список цифр в
38276
отсортированном23678
список цифр в
38627
отсортированном23678
Приращение грубой силы, сортировка и сравнение
Вдоль решений грубой силы будут преобразованы в строку и перебор всех возможных чисел с использованием этих цифр.
Создайте целые из них, поместите их в список и отсортируйте, получив следующую запись после целевой записи.
Если бы вы потратили на это 30 минут и, по крайней мере, не придумали хотя бы грубого подхода, я бы вас тоже не нанял.
В деловом мире решение, которое является не элегантным, медленным и неуклюжим, но выполняет свою работу, всегда более ценно, чем вообще никакого решения, фактически, оно в значительной степени описывает все деловое программное обеспечение, не элегантное, медленное и неуклюжее.
источник
источник
Твоя идея
довольно хорошо, на самом деле. Вам просто нужно учитывать не только последнюю цифру, но и все цифры менее значимые, чем рассматриваемые в настоящее время. Поскольку до этого мы имеем монотонную последовательность цифр, то есть крайняя правая цифра меньше, чем ее правая соседка. Рассматривать
Следующее большее число, имеющее те же цифры
Найденная цифра заменяется на последнюю цифру - наименьшую из рассмотренных цифр, а остальные цифры располагаются в порядке возрастания.
источник
Я вполне уверен, что ваш интервьюер пытался мягко подтолкнуть вас к чему-то вроде этого:
Не обязательно самое эффективное или элегантное решение, но оно решает предоставленный пример в два цикла и меняет цифры по одному, как он предложил.
источник
Возьмите число и разбейте его на цифры. Так что, если у нас есть 5-значное число, у нас есть 5 цифр: abcde
Теперь поменяйте местами d и e и сравните с исходным числом, если оно больше, у вас есть ответ.
Если он не больше, поменяйте местами e и c. Теперь сравните и, если оно меньше, поменяйте местами d и e снова (обратите внимание на рекурсию), возьмите наименьшее.
Продолжайте, пока не найдете большее число. С рекурсией это должно работать примерно как 9 строк схемы или 20 из c #.
источник
Это очень интересный вопрос.
Вот моя версия Java. У меня уйдет около 3 часов от выяснения шаблона до полного завершения кода, прежде чем я проверю комментарии других участников. Рад, что моя идея совершенно такая же, как и у других.
O (n) решение. Честно говоря, я не смогу пройти это собеседование, если на это уйдет всего 15 минут и мне понадобится закончить код на белой доске.
Вот несколько моментов, интересных для моего решения:
Я добавляю подробный комментарий в мой код и Big O на каждом шаге.
Вот результат работы в Intellj:
источник
Реализация javascript алгоритма @ BlueRaja.
источник
Решение (на Java) может быть следующим (я уверен, что друзья здесь могут найти лучшее):
начинайте поменять цифры с конца строки, пока не получите большее число.
Т.е. сначала начинайте двигаться вверх по нижней цифре. Затем по следующей более высокой и т.д.
Тогда сортируй остальное. В вашем примере вы получите:
источник
63872
Почему это должно быть?Если вы программируете на C ++, вы можете использовать
next_permutation
:источник
100
? :-)При ответе на этот вопрос я ничего не знал об алгоритме грубой силы, поэтому подошел к нему с другой стороны. Я решил поискать весь спектр возможных решений, в которые можно переставить это число, начиная с number_given + 1 до максимального доступного числа (999 для трехзначного числа, 9999 для четырехзначного и т. Д.). Я сделал подобный поиск палиндрома со словами, отсортировав номера каждого решения и сравнив его с отсортированным числом, указанным в качестве параметра. Затем я просто вернул первое решение в массиве решений, так как это было бы следующим возможным значением.
Вот мой код в Ruby:
источник
Код PHP
источник
Я проверил это только с двумя числами. Они работали. Работая IT-менеджером в течение 8 лет до ухода на пенсию в декабре прошлого года, я заботился о трех вещах: 1) Точность: хорошо, если это работает - всегда. 2) Скорость: должна быть приемлемой для пользователя. 3) Ясность: я, наверное, не такой умный, как ты, но я тебе плачу. Обязательно объясните, что вы делаете, на английском языке.
Омар, удачи в будущем.
источник
Подробное описание того, как это сделать, см. В разделе « Алгоритм L » в книге Кнута « Искусство компьютерного программирования: создание всех перестановок » (.ps.gz).
источник
Вот мой код, это модифицированная версия этого примера
Библиотека:
Тест:
источник
Добавьте 9 к данному n-значному номеру. Затем проверьте, находится ли он в пределах предела (первая (n + 1) цифра). Если это так, проверьте, совпадают ли цифры в новом номере с цифрами в оригинальном номере. Повторите добавление 9, пока оба условия не будут выполнены. Остановите алгоритм, когда число выходит за пределы.
Я не мог придумать противоречивый контрольный пример для этого метода.
источник
Просто еще одно решение с использованием Python:
Вывод:
источник
источник
Ниже приведен код для генерации всех перестановок числа ... хотя сначала нужно преобразовать это целое число в строку, используя String.valueOf (integer).
источник
источник
Еще одна реализация Java, запускаемая из коробки и дополненная тестами. Это решение O (n) пространства и времени с использованием старого доброго динамического программирования.
Если кто-то хочет брутфорс, есть 2 вида брутфорс:
Перестановка всех вещей, затем выберите мин выше: O (n!)
Аналогично этой реализации, но вместо DP выполнение шага заполнения карты indexToIndexOfNextSmallerLeft будет выполняться в O (n ^ 2).
источник
Нам нужно найти самый правый бит 0, за которым следует 1, и перевернуть этот самый правый бит 0 в 1.
Например, допустим, что наш ввод 487, что в двоичном виде 111100111.
мы переворачиваем самое правое 0, за которым следует 1
поэтому мы получаем 111101111
но теперь у нас есть дополнительный 1 и один меньше 0, поэтому мы уменьшаем число 1 справа от перевёрнутого бита на 1 и увеличиваем число бит 0 на 1, получая
111101011 - двоичный код 491
источник
источник
Вот реализация Java
Вот модульные тесты
источник
Я знаю, что это очень старый вопрос, но все же я не нашел простой код в C #. Это может помочь парням, которые посещают интервью.
источник
Очень простая реализация с использованием Javascript, следующий по числу с теми же цифрами
Поскольку комментариев много, лучше скопировать их в текстовый редактор. Спасибо!
источник
Есть много хороших ответов, но я не нашел достойной реализации Java. Вот мои два цента:
источник
источник