Как бы мне попробовать и ожидать, что блок python перехватит бесконечный l oop в цикле for - PullRequest
0 голосов
/ 07 апреля 2020

Я работаю над проблемой, когда мне нужно вывести наименьшее число, большее N, состоящее из тех же цифр, что и N. Если такого числа нет, я должен вывести «0» в качестве вывода. Это код, который у меня есть на данный момент ...

n = int(input())
copy = n+1
while True:
    if sorted(str(n)) == sorted(str(copy)):
        print(copy)
        break
    else:
        copy+=1

Я не могу найти способ поймать, если число не имеет таких чисел, поэтому, поэтому "0". Я думал, что блок блок «ожидаешь», но он как-то ловит бесконечные циклы. Любая идея о том, как реализовать это, или какие-либо другие предложения? Спасибо!

ОБРАЗЕЦ ВХОДА / ВЫХОДА

вход 1: 156

выход 1: 165

вход 2: 330

выход 2: 0 (ни один такой номер не удовлетворяет условию)

вход 3: 27711

выход 3: 71127

1 Ответ

1 голос
/ 07 апреля 2020

У меня другой подход к проблеме:

  1. Если все цифры отсортированы в порядке убывания, то вывод всегда равен -1. Например, 321.
  2. Для других случаев нам нужно обработать число с правой стороны (почему? Потому что нам нужно найти наименьшее из всех больших чисел)

Алгоритм

  1. Пройдите заданное число от крайнего правого ди git, продолжайте движение, пока не найдете ди git, который меньше, чем ранее пройденный ди git. Например, если входной номер равен «534976», мы останавливаемся на 4, потому что 4 меньше, чем следующий di git 9. Если мы не найдем такой di git, то вывод будет «Не возможен».

  2. Теперь ищем в правой части найденного выше di git 'd' наименьшее di git больше, чем 'd'. Для «534976» правая часть 4 содержит «976». Наименьшее значение di git больше 4 равно 6.

  3. Поменяйте местами две найденные цифры, в приведенном выше примере мы получим 536974.

  4. Теперь отсортируйте все цифры от позиции рядом с 'd' до конца числа. Число, которое мы получаем после сортировки, является выходным. Наконец, для приведенного выше примера, мы получаем «536479», который является следующим большим числом для входа 534976.

  5. На последнем шаге мы должны проверить погоду, результат является 32-битным числом или нет .


Код

def nextGreaterElement(n):
    n = list(str(n))
    N = len(n)

    for x in range(N - 1, 0, -1):
        if n[x] > n[x - 1]:
            i = x - 1
            break
    else:
        return -1

    swap = i + 1
    pos = i

    for x in range(swap, N):
        if n[pos] < n[x] < n[swap]:
            swap = x

    n[pos], n[swap] = n[swap], n[pos]

    ans = int(''.join(n[:pos + 1]) + ''.join(sorted(n[pos + 1:])))

    return ans if len(bin(ans)[2:]) < 32 else -1    


print(nextGreaterElement(123))
# 132
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...