数字内组合得到下一个比该数大的数
# 随意输入一个数字,用该数字内的数字组合出下一个比该数大的新数。
# 例如输入14321 下一个是 21134
# 这类问题,除了能给出穷举可能序列,并且找出下一个大的数字外
# 可以通过,人工的罗列下几个可能得数字找规律。
# 例如这一题的规则是:从后至前的找第一对逆序位置,交换逆序位置的元素,并且将前逆序位置后的数字进行顺序的重排
1 #!/usr/bin/env python 2 import sys, re, os 3 def findinv( n, end ): 4 i = end 5 while i >= 1: 6 j = i-1 7 while j >= 0: 8 if n[i] > n[j]: 9 return j, i 10 j -= 1 11 i -= 1 12 return -1, -1 13 14 def reorder( n, i ): 15 for j in range(i, len(n)-1): 16 for k in range(j+1, len(n)): 17 if n[j] > n[k]: 18 x = n[j] 19 n[j] = n[k] 20 n[k] = x 21 return n 22 23 def next( n ): 24 end = len(n) 25 if end == 1: return ''.join( map(lambda x:str(x), n) ), False 26 last = n[end-1] 27 i, j = findinv( n, end - 1 ) 28 if i==-1 and j==-1: return ''.join( map( lambda x:str(x),n) ), False 29 temp = n[i] 30 n[i] = n[j] 31 n[j] = temp 32 n = reorder(n, i+1) 33 return ''.join(map( lambda x:str(x), n ) ), True 34 35 a = int(sys.argv[1].strip()) 36 num = [] 37 while a>0: 38 num.append( a%10 ) 39 a/=10 40 a = int(a) 41 num.reverse() 42 print num 43 print next( num )
*******************************
***** Never ever let you down. *****
*******************************