2016-11-02 3 views
0

мой код кажется правильным, но мне нужно его вернуть -1, если не больше, число не может быть сгенерирован:следующий наибольшее число с одинаковыми цифрами

def next_bigger(n): 
    strNum = str(n) 
    length = len(strNum) 
    for i in range(length-2, -1, -1): 
     current = strNum[i] 
     right = strNum[i+1] 
     if current < right: 
      temp = sorted(strNum[i:]) 
      next = temp[temp.index(current) + 1] 
      temp.remove(next) 
      temp = ''.join(temp)  
      return int(strNum[:i] + next + temp) 
     else: 
      return -1 
    return n 

Моя попытка решить эту проблему не работает: добавление else это то, что я считал альтернативой тому, когда current больше, чем right.

Пожалуйста, помогите!

+0

Можете ли вы привести примеры значений, которые вы хотите быть возвращены в течение некоторого ввода? –

+0

Несколько вещей помогут здесь - во-первых, было бы здорово получить некоторые комментарии в этом коде, чтобы мы могли попытаться понять, что это решение пытается сделать. Во-вторых, вы должны показать несколько примеров 'next_bigger' с результатом, который он сгенерирован. Это идеальный вариант, если вы показываете оба тестовых примера, которые работают, а те, которые нет. – mgilson

+0

Test.assert_equals (next_bigger (12), 21) Test.assert_equals (next_bigger (513), 531) Test.assert_equals (next_bigger (2017), 2071) Test.assert_equals (next_bigger (414), 441) Тест .assert_equals (next_bigger (144), 414) –

ответ

1

Во всяком случае, поток кода не так: в цикле, вы имеете следующую структуру:

 
for A : 
    if B : 
     return 
    else : 
     return 

Так что ваша программа всегда будет заканчиваться до второй итерации.

Извините, что разместил это в ответе, но я не могу комментировать.

0

В некоторых случаях исправление кода намного сложнее, чем переписывание. Я не уверен, насколько вам это поможет, но попробуйте следующий код.

def next_bigger(n): 
    str_num = str(n) 
    size = len(str_num) 
    for i in range(2, size + 1): 
     sublist = list(str_num[-i:size]) 
     temp = sorted(sublist, reverse=True) 
     if sublist != temp: 
      return int(str_num[:size-i] + ''.join(temp)) 
    return -1 

Что она делает то, что он разрезает номер со спины (начиная с 2-х ломтиков элементов и происходит до len) и проверяет, чтобы увидеть если генерируемое срез производит самое большое количество возможно, когда присоединился к. Если нет, то его заменят следующим большим и возвращают. Дайте мне знать, если бы это сработало для вас.


Пример

n = 4181536841 

sublist = ['4', '1'] 
temp = ['4', '1'] # they are the same so no larger number can be produced just by looking at a slice of length 2. 

#---------iteration 2--------------- 
sublist = ['8', '4', '1'] 
temp = ['8', '4', '1'] # they are again the same so no larger number can be produced just by looking at a slice of length 3. 

#---------iteration 3--------------- 
sublist = ['6', '8', '4', '1'] 
temp = ['8', '6', '4', '1'] # now they are different. So produce a number out of temp (8641) ans stich it to the rest of the number (418153) 
return 4181538641 
+0

+1 для «Фиксация кода сложнее, чем переписывание». Просто потратил три дня на работу, не задумываясь, и это было дерьмо. Провел день после переписывания всего с нуля, и он работал, помимо того, что был чище. –

Смежные вопросы