【计蒜客】DNA排序(T1246)的题解(用Python来实现)

文章目录


前言

        该方法仅是第一次结果成功的实现,未对其进行深度优化。

        仅限提供相关思路,欢迎在评论区提出其他题解思路。


一、题目详情(DNA排序)

        现在有一些长度相等的 DNA 串(只由 ACGT 四个字母组成),请将它们按照逆序对的数量多少排序。

        逆序对指的是字符串A中的两个字符 A[i]、A[j],具有 i < j 且 A[i] > A[j] 的性质。如字符串 "ATCG" 中,T 和 C 是一个逆序对,T 和 G 是另一个逆序对,这个字符串的逆序对数为 22。

输入格式

第 11 行:两个整数 nn 和 mm,n(0<n \le 50)n(0<n≤50) 表示字符串长度,m(0<m \le 100)m(0<m≤100) 表示字符串数量;

第 22 至 m+1m+1 行:每行是一个长度为 nn 的字符串。

输出格式

按逆序对数从少到多输出字符串,逆序对数一样多的字符串按照输入的顺序输出。

题目链接:DNA排序https://nanti.jisuanke.com/t/T1246

二、题解详细

1.大致思路

通过对给定的DNA序列进行字母数字化,判断不同DNA序列总体的数字大小,将其排序。进而根据排序后的数组的大小,来逐一输出相应的结果。最终达到题目的要求。

2.Python的代码实现

代码如下:

def reverse(n):   #将对应的碱基对转换为数字
    if n == "A":
        return 0
    elif n == "C":
        return 1
    elif n == "G":
        return 2
    else:
        return 3

def all_reverse(s,m):  
    t = []
    s = s[-m:]
    for i in s:
        t.append(reverse(i))
    return t

def count_list(one,list1,r,su):
    del list1[0:r]
    if one == 0:
        su = 0 + su
    elif one == 1 :
        su = list1.count(0) + su
    elif one == 2 :
        su = list1.count(0) + list1.count(1) + su
    else:
        su = list1.count(0) + list1.count(1) + list1.count(2) + su
    return su

def fun3(dict,value):  #根据字典的结果来判断相应的字典的名称
    t = [m for m,n in dict.items() if n == value]
    for i in t:
        return i

def fun2(list_origin,list_test):
    num1 = 1
    list1 = []
    dict1 = {}
    list_aim = []
    for q in list_origin:
        dict1[q] = num1
        num1 += 1

    for e in list_test:
        r = dict1[e]
        list1.append(r)
    list1.sort()
    for i in list1:
        y = fun3(dict1,i)
        list_aim.append(y)
    return list_aim

def fun(dict,value,h):  #判断元素是否有重叠
    t = [m for m,n in dict.items() if n == int(value)]
    t = fun2(h,t)
    h = "\n".join(t)
    for i in t:
        del dict[i]
    dict[h] = value

def clean_num(a):
    for i in a:
        if i in "0123456789":
            a = a.replace(i,"")
    return a

t = []
p = []
h = []
yy = set()
r2 = 1
r = 0
su = 0
dict = {}
m,n= input().split(" ")
m = int(m)
n = int(n)

for o1 in range(n): #将DNA转化为数字,存放于列表中
    a = input()
    a = str(r2)+a
    h.append(a)
    t.append(all_reverse(a,m))
    r2 += 1

for i1 in t:  #计算逆序对
    for i2 in i1:
        list1 = i1.copy()
        r +=1
        su = count_list(i2,list1,r,su)
    p.append(su)
    r = 0
    su = 0

for i3 in range(n):
    dict[h[i3]] = p[i3]

for uu in list(dict.values()):
    uu = int(uu)
    yy.add(str(uu))

for l in list(yy):
    fun(dict,l,h)

o = list(dict.items())
o.sort(key=lambda x:int(x[1]),reverse=False)

for u in range(len(o)):
    id,numb = o[u]
    print(clean_num(id))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值