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 ответа
Поскольку здесь требуется новый алгоритм, я постараюсь дать несколько советов. Посмотрите на вывод
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
?
Дело не столько в реализации.
С подобными проблемами (типичными для соревнований по кодированию) всегда одно и то же: вы должны найти умный алгоритм вместо того, чтобы записывать в виде кода прямую реализацию описания проблемы.
Я сам не разбирался в проблеме, но постараюсь ответить на несколько вопросов:
- Может ли из всех возможных перестановок достаточно просто обменять две цифры? Или: Можете ли вы быть уверены, что включение третьей цифры в обмен не имеет значения (результат ниже исходного числа, результат идентичен двухзначному регистру или результат выше двухзначного результата, но не между исходным числом и 2-значный результат)?
- Если вы можете доказать, что двух цифр достаточно, какие две цифры дают наименьший результат (больше, чем исходное число)?
Может быть, поможет сделать несколько примеров вручную и увидеть какой-нибудь узор.
не питон, но это ответ en.cppreference.com/w/cpp/algorithm/next_permutation
— Ханна В.
Понятно, спасибо, что у меня появилась новая идея реализовать это
— Эдмерсон Сланец