思路:
举例:找出“1342”的下一个最大元素
步骤:
1)从倒数两位开始检查是否满足倒序排列,即“42”,“342”,“1342”,发现“342”开始不满足倒序排列。
2)找出该子排列“342”中比第一个数字“3”大的最小数字,即“4”。
3)交换该子排列“342”中的第一个数字“3”和找到的比“3”大的最小数字“4”,即子排列变为“432”。
4)对该子排列,保持第一个数字不动,剩余元素升序排列,即“423”,再把该子排列拼接回原排列的对应位置,即“1423”,得解。
注意:排序完的值要在int32的范围内。
import sys
def find(n):
n_str=[c for c in str(n)]
for i in range(2,len(n_str)+1):
temp_str=n_str[len(n_str)-i:len(n_str)]
if temp_str!=sorted(temp_str,reverse=True):#说明当前子区间之内存在下一个最大元素
now_first=int(temp_str[0])
min_j=sys.maxsize#min_j要大于nowfirst
min_j_index=0
for j in range(1,len(temp_str)):
if int(temp_str[j])<min_j and int(temp_str[j])>now_first:
min_j=int(temp_str[j])
min_j_index=j
temp_str[0],temp_str[min_j_index]=temp_str[min_j_index],temp_str[0]
temp_str[1:]=sorted(temp_str[1:])#后面部分升序
n_str[len(n_str)-i:len(n_str)]=temp_str
return int(''.join(n_str)) if -2147483648<=int(''.join(n_str))<=2147483647 else -1
return -1
print(find(1999999999))