Предупреждение: не программист на C, поэтому мой код определенно может быть улучшен.
Давайте сделаем вид, что находим следующую большую перестановку цифр от 1 до 9.
Например, предположим, что мы имеем: 123479865
Мы хотим, чтобы найти наименьшее число больше, чем 123479865, которое может быть получено путем перестановки цифр 123479865.
Что это означает, что мы должны сделать по крайней мере, на одну цифру, большую, чем в настоящее время. Если бы у нас был наш выбор, мы бы хотели сделать самую правую цифру больше, поскольку это приведет к наименьшему изменению. Если бы мы сделали большее число слева, это привело бы к большему изменению стоимости.
например: 12347986 => 12347986 гораздо меньше изменений, чем 23479865 => 23479865.
Поэтому мы хотим, чтобы найти дальнюю цифру вправо, что мы можем сделать больше. Чтобы увеличить цифру, мы должны найти еще одно число, большее, чем в нашей последовательности, и затем поменять их.
Примечание: мы не можем поменять число (например, 5) на число слева (например, 6), потому что тогда мы будем уменьшать значение цифры слева от нас, что сделало бы наше общее число меньше , Например, если мы заменили 5 на 6, мы получим 1234798 , который меньше 1234798 . Таким образом, мы всегда поменяем номер справа от нас.
Итак, давайте рассмотрим 123479865, начиная с самой правой цифры.
Нет ничего большего, чем 5 справа от 5, поэтому мы не можем сделать 5 больше.
Теперь давайте рассмотрим 6. Нет ничего большего, чем 6 справа от 6, поэтому мы не можем сделать 6 больше.
Теперь давайте рассмотрим 8. Нет ничего большего, чем 8 справа от 8, поэтому мы не можем сделать 8 больше.
Теперь давайте рассмотрим 9. Нет ничего большего, чем 9 справа от 9, поэтому мы не можем сделать 9 больше.
Теперь рассмотрим 7. Есть несколько чисел справа от 7, которые больше 7, а именно: 9 и 8. Поэтому мы можем сделать 7 больше. Мы хотим сделать его больше на наименьшую сумму, поэтому мы должны поменять его наименьшим значением, которое больше 7. Другими словами, мы должны поменять 7 на 8. Это дает нам: 1234 65 .
число 123489765 больше, чем 123479865, но мы действительно можем сделать его меньше, сохраняя при этом, что это больше, чем 123479865. мы можем сделать это, потому что мы теперь имеем бесконечную свободу менять любой из следующих цифр: 12348 (что-либо справа от 8). Эти цифры могут быть как можно меньше, потому что 8 слева от них гарантируют, что новое число всегда больше.
Лучший способ сделать цифры 9765 меньше - сортировать их в порядке возрастания, давая нам 5679. Сортировка работает, потому что самые левые значения места вносят наибольший вклад в общее значение. Поэтому мы хотим, чтобы самые левые цифры были наименьшими цифрами.
Это оставляет нам 12348 , что является нашим ответом.
Примечание: нам действительно не нужно сортировать числа справа от 8. Мы можем фактически изменить порядок, потому что мы знаем, что числа с правой стороны до 8 находятся в порядке возрастания (поскольку ранее мы остановились первый раз мы получили число, которое было меньше его предыдущего номера).
Возможно, вам захочется начать с массива, который дает количество вхождений каждого символа в строке (т. Е. Используя символ в качестве индекса в массив). Это поможет вам произвести перестановки в правильном порядке. –
Обновление: я смог сделать это, используя эту стратегию. –