字典序算法的理解,并用python代码实现字典序算法

算法题目:

给定一个正整数,实现一个方法来求出离该整数最近的大于自身的换位数。
如:
输入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





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值