算法题目:
给定一个正整数,实现一个方法来求出离该整数最近的大于自身的换位数。如:
输入12345,返回12354
输入12354,返回12435
输入12435,返回12453
获得最近换位数的三个步骤:
1.从后向前查看逆序区域,找到逆序区域的前一位
2.把逆序区域的前一位和逆序区域中刚刚大于它的数字交换位置
3.把原来的逆序区域转为顺序
举个例子:
输入12354,找到离它最近且大于它的换位数
尽量保持高位不变,低位在最小的范围内变换顺序
#究竟需要变换多少位取决于当前整数的逆序区域
倒数第3位已经确定
把最后两位转变回顺序
python代码的实现:
# -*- coding: UTF-8 -*-
import copy
def findTransferPoint(numbers):
for i in range(len(numbers)-1,-1,-1): #从后往前查找,找到逆序区域的前一位
if numbers[i]>numbers[i-1]:
return i
return 0 #逆序返回0
def exchangeHead(numbers,index):
head=numbers[index-1]
for i in range(len(numbers)-1,-1,-1):
if head<numbers[i]:
numbers[index - 1] = numbers[i]
numbers[i] = head
break
return numbers
def reverse(num,index):
a = len(num)
for k in range(index, a):
for j in range(k+ 1, a):
if num[k] > num[j]:
num[k], num[j] = num[j], num[k]
return num
def run(): #执行的函数
numbers = [1,2,3,5,4]
index=findTransferPoint(numbers) #找到交换的点
if index:
num=exchangeHead(numbers,index) #交换
a=reverse(num,index) #逆序区域转化成有序
print a
else:
print"没有更大的换位数"
run()
参考文章:
什么是字典序算法
网址:
http://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653193612&idx=1&sn=95d5bf75272aaeeb9a90bea6baa24de4&chksm=8c99f756bbee7e401db790f060cbdab4e850380f5cbd727e1dab28cb1b2bf38cecc0cc4bbfb6&mpshare=1&scene=23&srcid=0412s69YTwJUBW1r4DtKPdb6#rd