Получите следующее большее число, переставив цифры входящего целого числа

from itertools import permutations
def next_bigger(n):
    nlist = list(str(n))
    perm = permutations(nlist,len(str(n)))
    perm = set(perm)
    listofperm = []
    nlist = int("".join(nlist))
    for x in perm:
        form = int("".join(x))
        if form < nlist:
            continue
        else:
            listofperm.append(form)
    listofperm = sorted(listofperm)

    if (listofperm.index(n) + 1) == len(listofperm):
        indexofn = listofperm.index(n)
    else:
        indexofn = listofperm.index(n) + 1 
    return listofperm[indexofn]

Я пытаюсь получить следующее большее число, переставляя цифры n но мой код очень неэффективен. Можете ли вы предложить способы сделать мой код более эффективным и быстрым?

Входными данными может быть любое целое число.

2 ответа
2

Поскольку здесь требуется новый алгоритм, я постараюсь дать несколько советов. Посмотрите на вывод

from itertools import permutations
sorted([a*1000 + x*100 + y*10 + z for a,x,y,z in permutations([1,2,3,4])])

Какие цифры, вероятнее всего, будут различаться между последовательными членами этого списка?

Посмотрите на элементы, которые начинаются с 4. Вы видите закономерность в остальных цифрах? Если да, то как должны измениться остальные цифры при первом изменении?

То же самое и с цифрами? a,b,c,d на месте 1,2,3,4?

  • 1

    Понятно, спасибо, что у меня появилась новая идея реализовать это

    — Эдмерсон Сланец

Дело не столько в реализации.

С подобными проблемами (типичными для соревнований по кодированию) всегда одно и то же: вы должны найти умный алгоритм вместо того, чтобы записывать в виде кода прямую реализацию описания проблемы.

Я сам не разбирался в проблеме, но постараюсь ответить на несколько вопросов:

  • Может ли из всех возможных перестановок достаточно просто обменять две цифры? Или: Можете ли вы быть уверены, что включение третьей цифры в обмен не имеет значения (результат ниже исходного числа, результат идентичен двухзначному регистру или результат выше двухзначного результата, но не между исходным числом и 2-значный результат)?
  • Если вы можете доказать, что двух цифр достаточно, какие две цифры дают наименьший результат (больше, чем исходное число)?

Может быть, поможет сделать несколько примеров вручную и увидеть какой-нибудь узор.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *