文章目录
前言
该方法仅是第一次结果成功的实现,未对其进行深度优化。
仅限提供相关思路,欢迎在评论区提出其他题解思路。
一、题目详情(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))