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

 

posted on 2019-05-17 22:15  必须喝三瓶大力  阅读(424)  评论(0)    收藏  举报

导航