Rosalind 026 Enumerating Oriented Gene Orderings

背景:

这个问题涉及对从1到n的数字进行排列,并为每个数字分配正号或负号。

长度为n的带符号排列包括按照特定顺序排列数字1到n,然后为每个数字分配正号或负号。

这个题目也是一个数学问题,一个求排列组合的数学问题,我们来说说,如果给定了一个n,到底有多少种排列方法:

  1. 首先,长度为n的排列总数为n的阶乘,即n!
  2. 对于每个长度为n的排列,可以为每个数字分配正号或负号。因此,对于每个数字有两种选择(正号或负号),总的排列方式为2的n次方。
  3. 因此,长度为n的带符号排列的总数为    n! * 2^{n} 种。

题目的要求:

  • 给定:一个小于6的正整数
  • 返回:给定n的所有带符号排列的方法的总数,并列出这些排列(顺序随意)。

解决方法:

我们可以使用python中,itertools包中的permutations函数进行解答,这个函数提供了一种方便的方法来生成所有可能的排列,我们可以新建一个列表,把题目给定的1~n的数全部放进去,包括负数,假如题目给了一个 2,我们这个列表就为[1,-1,2,-2],以此类推。然后用这个长度为2n的数组,使用permutations函数生成长度为2的排列。注意,有可能会出现(1,-1),即两个数绝对值相等的情况。所以每生成一个排列,我们要把里面的数检查一遍,看看有没有存在绝对值相等的一组数,如果有,我们就抛弃这个排列。

代码:

import itertools
def is_Scalar(args):               #判断函数,判断集合中有无“重复的值”(取绝对值后)
    args = [abs(i) for i in args]
    for i in args:
        if args.count(i)>1:
            return False
    return True
n = ?
data = []
for i in range(1,n+1):
    data.append(i)
    data.append(-1*i)
res=[]
per_list = itertools.permutations(data,n)
for i in per_list:
    if is_Scalar(i):
        res.append(i)
print(len(res))
for i in res:            #根据题目要求输出
    i = list(i)          #tuple -->  list
    i = map(lambda x:str(x),i)   #list里的值  int ---> str
    print(' '.join(i))



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值