来源
OpenJudge网站 – 百练习题集-第1007号习题
建议学编程的人士利用好这个网站。
总时间限制: 1000ms 内存限制: 65536kB
描述
现在有一些长度相等的DNA串(只由ACGT四个字母组成),请将它们按照逆序对的数量多少排序。
逆序对指的是字符串A中的两个字符A[i]、A[j],具有i < j 且 A[i] > A[j] 的性质。如字符串”ATCG“中,T和C是一个逆序对,T和G是另一个逆序对,这个字符串的逆序对数为2。
输入 第2至m+1行:每行是一个长度为n的字符串 题目描述给出的测试用例覆盖了所有DNA串的逆序对数目都不同的情形。 有DNA串的逆序对数目一样多的情形。在这种情形下,先输入的要先输出。这一个测试用例是在题目描述给出的测试用例基础上改的。上一节给出的代码中第21,22行输出出各个DNA串的逆序对数目。 m=1的边界情形。 上一节的代码中的第10到16行,用于测试reverse_count函数的正确性。这么做更有针对性,测试用例的输入和期望输出更容易构造。
第1行:两个整数n和m,n(0
输出
按逆序对数从少到多输出字符串,逆序对数一样多的字符串按照输入的顺序输出。
样例输入
10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT
样例输出
CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA解题思路
参考答案
#DNA字符串dna_str有多少个逆序对
def reverse_count(dna_str):
count = 0
for i in range(len(dna_str) - 1):
for j in range(i + 1, len(dna_str)):
if dna_str[i] > dna_str[j]:
count += 1
return count
#测试reverse_count正确性的语句:
# assert reverse_count("CA") == 1
# assert reverse_count("AC") == 0
# assert reverse_count("CAA") == 2
# assert reverse_count("TCAA") == 5
# assert reverse_count("A") == 0
# assert reverse_count("ACGT") == 0
# assert reverse_count("TGCA") == 3 + 2 + 1
n, m = [int(s) for s in input().split()]
dnas = [input() for i in range(m)]
# for dna in dnas:
# print(dna, ":", reverse_count(dna))
dnas.sort(key=lambda dna: reverse_count(dna))
# dnas.sort(key=reverse_count) #这样写也可以
for dna in dnas:
print(dna)
测试用例
样例输入
10 6
AAACTGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT
样例输出
AAACTGAAGG
CCCGGGGGGA
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA
样例输入
10 1
AAACTGAAGG
样例输出
AAACTGAAGG小结