Интересный вопрос. Я полагаю, что вы могли бы начать с самого простого подхода, который бы использовал грубую силу для создания всех возможных чисел с использованием рекурсии (в зависимости от проблемы и языка, это может быть изменено на итерацию) и отслеживал, какой из них самый большой. Например, {1, 83, 91} даст вам {18391, 19183, 83191, 83911, 91183, 91831}, из которых вы можете определить 91831 как наибольшее число.
Использование решения, которое сортирует исходные числа и объединяет числа по порядку, имеет ловушку в том, что если у вас есть что-то вроде {9, 82, 99}, отсортированный массив будет {99, 82, 9}. Однако это приведет к 99829, когда наибольшее число будет на самом деле 99982.
Поскольку решение с использованием грубой силы работает, но может быть неоптимальным с точки зрения производительности, может быть полезно проверить способы оптимизации решения (конечно, после профилирования исходного решения). Например, вы можете начать с простой схемы заказа, умножив отдельные цифры номера на место, которое они будут занимать.
{ 9, 98, 95 }
Приведенный выше набор приведет к пятизначному числу. Мы применим простую формулу, которая умножает отдельную цифру на ее место (1 на 1-е место, 2 на 10-е место и т. Д.) И суммирует их следующим образом:
9 -> 9 * 5
98 -> 9 * 5 + 8 * 4
95 -> 9 * 5 + 5 * 4
, что приводит к
9 -> 45
98 -> 77
95 -> 65
Теперь, как люди, мы знаем, что 9 должны стоять на первом месте, а не на 98 или 95. Один из способов исправить это - отдать предпочтение однозначным числам, если первые цифры кандидатов совпадают (т. Е. 9 или 98/95 / др.). Обобщая немного, вы можете выбрать кандидата с меньшим количеством цифр каждый раз, если цифры слева больше или эквивалентны (если количество цифр равно, используйте приведенную выше формулу). Если у нас {9871, 986}, 9871 будет иметь более высокое значение, но мы посмотрим на 986 и увидим, что в нем меньше цифр.
9 8 7 1
| | | |
9 8 6
8 совпадений, продолжить, 7 больше, поэтому проигнорируйте 986 (9871986 против меньшего 9869871). Если бы набор был {9861, 987} вместо:
9 8 6 1
| | | |
9 8 7
8 совпадений, продолжить, 7 больше, поэтому выберите 987 (9879861 против меньшего 9861987).
Итак, протестируем это, используя следующий набор:
{ 7, 61, 811, 99 }
Результатом будет 8-значное число. Применение формулы размещения дает:
7 -> 7 * 8 = 56
61 -> 6 * 8 + 1 * 7
811 -> 8 * 8 + 1 * 7 + 1 * 6 = 77
99 -> 9 * 8 + 9 + 7 = 135
Итак, 99 выглядит так, как будто он пойдет первым, но теперь давайте применим вторую часть алгоритма, выбрав числа с меньшим количеством цифр:
7
7, конечно, не совпадает с 9, поэтому у нас остается 99 в качестве первого числа.
9 9 _ _ _ _ _
Следующая итерация:
7 -> 7 * 6 = 42
61 -> 6 * 6 + 1 * 5 = 41
811 -> 8 * 6 + 1 * 5 + 1 * 4 = 57
811 имеет самое высокое значение, и оба 61 и 7 не имеют одинаковых цифр слева направо, поэтому мы вставляем 811.
9 9 8 1 1 _ _ _
Следующая итерация:
7 -> 7 * 3 = 21
61 -> 6 * 3 + 1 * 2 = 20
7 имеет более высокое значение и ничто не имеет меньше цифр - вставьте:
9 9 8 1 1 7 _ _
Следующая итерация:
Осталось только одно число (61), поэтому мы вставим его
9 9 8 1 1 7 6 1 -> 99811761
и получите наибольшее число! Обратите внимание, что если бы 61 был чем-то вроде 81, он бы правильно оказался на месте 811 -> 99818117 вместо неправильного 99811817.