所以我收到了一个说明如下的挑战: "设计一个程序,该程序将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
答案 0 :(得分:6)
这是一种更有效的方法,使用14世纪印度数学家Narayana Pandita的算法,可以在Permutation上的维基百科文章中找到。这种古老的算法仍然是按顺序生成排列的最快的已知方法之一,它非常健壮,因为它可以正确处理包含重复元素的排列。
以下代码包含一个简单的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()
答案 1 :(得分:1)
我不相信你翻转数字的方法可以保证找到下一个最高数字(至少没有进一步检查)
这是一个简单的解决方案: 只需增加输入数字并检查是否满足条件或是否找不到数字。
set()
可用于获取数字中唯一数字的集合。
input_num = '781623954'
next_num = int(input_num) + 1
input_digits = set(input_num)
found = False
while not found:
next_num += 1
next_digits = set(str(next_num))
found = len(next_digits) == 9 and input_digits == next_digits
if next_num > 987654321:
break
if found:
print(next_num)
else:
print("No number was found.")
答案 2 :(得分:0)
input[8] == input[7]
input[7] == temp
你可能意味着:
input[8] = input[7]
input[7] = temp
不是吗?
正如评论中所述,它不会直接对字符串起作用,因为它在Python中是不可变的。因此,作为第一步,您可以从该字符串中创建一个字符列表:
input = list(input)
并且作为最后一步,从修改后的列表中获取一个字符串:
input = ''.join(input)
顺便说一下,您可能希望从Python元组解包中受益,它允许您交换两个变量而无需引入第三个变量:
input[7], input[8] = input[8], input[7]