我的代码似乎是正确的,但如果不能生成更大的数字,我需要它返回-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
时的替代方案。
请帮忙!
无论如何,你的代码流是错误的:在你的循环中,你有以下结构:
<>之前A:B:如果;返回其他:返回之前所以你的程序总是在第二次迭代之前终止。
库尼斯错了。例如,在4181536841之后的第二大数字是4181538146,而不是4181538641。
逻辑是这样工作的:
1 - Find where list[-n] > list[-n - 1]
2 - find next number higher than list[-n] after list[-n]
3 - Switch next highest and list[-n - 1]
4 - reorder the remaining numbers after list[-n] from low to high
e.g. 29357632:
1 - list[-n] = 7 --> 2935[7]632
since 7 > 5
2 - next highest number after list[-n] (7) is the 6 --> 29357[6]32
3 - switch list[-n-1] and next highest number (switch 5 and 6) -->
293[6]7[5]32
4 - reorder rest of digits after list[-n-1] (6) --> 2936[7532] > 29362357
所以29357632之后的最高数字是29362357
在某些情况下,修复代码比重写代码要困难得多。我不确定这对您有多大帮助,但请尝试以下代码。
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