【PTA-python】第6章-8 输出全排列 (20 分)

分析

初步想法,采用列表,如果有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)#按照字典序排列
posted @ 2021-04-23 19:28  flybird2008  阅读(23)  评论(0)    收藏  举报  来源