Next smaller number with the same digits,同样的数字串.不同顺序找到刚好给定数字小的数中最大的数
举例:
next_smaller(21) == 12
next_smaller(531) == 513
next_smaller(2071) == 2017
next_smaller(156456326) == 156456263
思路:
从后往前,把数字分为三部分
比如156456326,
可以分为三部分:
156456(不变的部分) +(剩下三位数中比3刚好小的数)+(剩下两位数能最大的数,也就是倒着排序)
结果就是 156456 2(比3小) 63(63比36大)
代码:
def next_smaller(n): list_n = list(str(n)) for index in range(len(list_n)-1,-1,-1): pre = list_n[0:index] later = list_n[index:len(list_n)] first_later_digit = 110 later = list(map(lambda x:int(x),later)) for index_later in range(len(later)): if later[index_later] - later[0]<0 and abs(later[index_later] - later[0]) < abs(first_later_digit -later[0]): first_later_digit = later[index_later] if first_later_digit != 110: later.remove(first_later_digit) later = list(map(lambda x:str(x),later)) guess_number = ''.join(pre) +str(first_later_digit)+ ''.join(sorted(later,reverse=True)) guess_number = int(guess_number) if guess_number <n and len(str(guess_number)) == len(str(n)): return guess_number return -1