【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)#按照字典序排列
  • 10
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值