解题思路:尽量不动高位数字(中心思想)。首先,比较倒数第二位数字与倒数第一位数字,若前者比后者大,则继续比较倒数第三位与倒数第二位,循环直到发现某高位数字比其低一位的数字小,这说明有了可操作空间。其次,对该高位数字后的所有数字进行筛选,选出所有大于该高位数字的数字,并从中选出最小值。最后,将选出的最小值替换该高位数字,再对剩下的数字按升序排序后加在最小值的末尾,问题解决。
def next_bigger(n):
n_list = list(str(n))
for i in range(len(n_list)-2, -1, -1):
if n_list[i] < n_list[i+1]:
temp = n_list[i:]
min_num = min([x for x in temp if x > temp[0]])
index = temp.index(min_num)
temp[0], temp[index] = temp[index], temp[0]
return int(''.join((n_list[0:i])) + temp[0] + ''.join(sorted(temp[1:])))
return -1