切换索引,使用相同的9位数字创建下一个最高的数字

Dav*_*kim 1 python loops

所以我收到了一个挑战,声明如下:"设计一个程序,将一个9位数字作为输入,其中没有数字出现两次,并产生与下一个最高数字对应的相同9位数的排列.如果不存在这样的数字,算法应该指出这一点.例如,如果输入是781623954,则输出将是781624359."

所以我提出了这个想法来翻转索引,所以检查最后一个索引,看看哪个更大,比较然后翻转,如果有必要但由于某种原因我的代码不工作.我只做了检查最后两位数而不是所有数字的工作,所以如果你可以帮我解决并为我检查,如果你对如何解决这个问题有任何更好的想法,请分享.

input = raw_input("Enter 9 Digits: ")
x = 9
while x>0:
    x-=1
    if input[8] > input[7]:
        temp = input[8]
        input[8] == input[7] 
        input[7] == temp
        print input
        break
Run Code Online (Sandbox Code Playgroud)

PM *_*ing 6

这是一种更有效的方法,使用14世纪印度数学家Narayana Pandita的算法,可以在维基百科关于置换的文章中找到.这种古老的算法仍然是按顺序生成排列的最快的已知方法之一,并且它非常健壮,因为它正确处理包含重复元素的排列.

下面的代码包含一个简单的test()函数,用于生成有序数字字符串的所有排列.

#! /usr/bin/env python

''' Find the next permutation in lexicographic order after a given permutation

    This algorithm, due to Narayana Pandita, is from
    https://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order

    1. Find the largest index j such that a[j] < a[j + 1]. If no such index exists, 
    the permutation is the last permutation.
    2. Find the largest index k greater than j such that a[j] < a[k].
    3. Swap the value of a[j] with that of a[k].
    4. Reverse the sequence from a[j + 1] up to and including the final element a[n].

    Implemented in Python by PM 2Ring 2015.07.28
'''

import sys

def next_perm(a):
    ''' Advance permutation a to the next one in lexicographic order '''
    n = len(a) - 1
    #1. Find the largest index j such that a[j] < a[j + 1]
    for j in range(n-1, -1, -1):
        if a[j] < a[j + 1]:
            break
    else:
        #This must be the last permutation
        return False

    #2. Find the largest index k greater than j such that a[j] < a[k]
    v = a[j]
    for k in range(n, j, -1):
        if v < a[k]:
            break

    #3. Swap the value of a[j] with that of a[k].
    a[j], a[k] = a[k], a[j]

    #4. Reverse the tail of the sequence
    a[j+1:] = a[j+1:][::-1]

    return True


def test(n):
    ''' Print all permutations of an ordered numeric string (1-based) '''
    a = [str(i) for i in range(1, n+1)]
    i = 0
    while True:
        print('%2d: %s' % (i, ''.join(a)))
        i += 1
        if not next_perm(a):
            break


def main():
    s = sys.argv[1] if len(sys.argv) > 1 else '781623954'
    a = list(s)
    next_perm(a)
    print('%s -> %s' % (s, ''.join(a)))


if __name__ == '__main__':
    #test(4)
    main()
Run Code Online (Sandbox Code Playgroud)