我有一个我似乎无法弄清楚的面试问题:给定一系列整数。编写一个程序来打印数组中数字的所有排列。输出应按降序排序。例如对于数组 { 12, 4, 66, 8, 9},输出应该是:
9866412
9866124
9846612
……
……
1246689
一个明显的解决方案是先排列然后排序,但这需要 n!记忆。我正在寻找需要多项式记忆的东西。
我尝试编写递归解决方案,该解决方案涉及从最大的字典序数开始生成排列:
def compare(x,y):
for i in range(max(len(x), len(y))):
if len(x) <= i:
return compare(x[0], y[i])
elif len(y) <= i:
return compare(x[i], y[0])
elif x[i] < y[i]:
return -1
elif x[i] > y[i]:
return 1
return 0
def print_all_permutations(so_far, num_lst):
if not num_lst:
print so_far
for i in range(len(num_lst)):
cur = num_lst.pop(i)
print_all_permutations(so_far + [str(cur)], num_lst)
num_lst.insert(i, cur)
input_arr = sorted([str(x) for x in [3,31,0]], cmp = compare, reverse=True)
但这对于以下情况失败:
['3', '31', '0']
3310
3031
error 3130(['31', '3', '0']) is greater than ['3', '0', '31'](3031)
3130
3103
331
313