分析
初步想法,采用列表,如果有n项,就创建n-1项列表。每个输入都会因为pop出元素而需要重新迭代赋值计算。效率比较低。
学习来的解法:将输入看作字符,存到列表里,定义函数,输入为初始元素和空字符串,输出从一个字符出发的长度为n的字符串。迭代实现。
题目
输入整数n(3<=n<=7),编写程序输出1,2,…,n整数的全排列,按字典序输出。
输入格式:
一行输入正整数n。
输出格式:
按字典序输出1到n的全排列。每种排列占一行,数字间无空格。
解法
解法1
import math
n=int(input())
num=[]
for i in range(n):
num.append(str(i+1))#将num扩充为字符列表,存储着所有的元素
def f(x,s=""):
s+=str(x)
if len(s)<n:#s的长度作为循环判断条件
for i in num:
if i not in s:#取那些不在s里的字符,连接起来
f(i,s)
else:
print(s)
for i in range(1,n+1):
f(i)
解法2
另有方法暴力枚举,比如输入3,从100开始到400的数据。建立一个字符集,对每个数据,分割,如果和字符集完全相同,那么就是相同的,可以输出。
import math
n=int(input())
num=[]
num=set([str(i) for i in range(1,n+1)]) #数字库
for i in range(pow(10,n-1),(n+1)*pow(10,n-1)):#枚举范围
i=str(i)
s=set()#s是个集合
for j in i:
s.add(j)#添加字符
if s==num:#集合与集合才能比较
print(int(i))
另外也有用random.shuffle()打乱次序,进行输出的
t=[]
s=set()
for i in range(1,n+1):
t.append(str(i))
all=factorial(n)#n个数字有n!种排列
while len(s)<all:
random.shuffle(t)#每次都打乱
s.add("".join(t))#拼成字符串,加到集合
s=sorted(s)#按照字典序排列