DNA Sorting
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 94974 | Accepted: 38197 |
Description
One measure of ``unsortedness'' in a sequence is the number of pairs of entries that are out of order with respect to each other. For instance, in the letter sequence ``DAABEC'', this measure is 5, since D is greater than four letters to its right and E is greater than one letter to its right. This measure is called the number of inversions in the sequence. The sequence ``AACEDGG'' has only one inversion (E and D)---it is nearly sorted---while the sequence ``ZWQM'' has 6 inversions (it is as unsorted as can be---exactly the reverse of sorted).
You are responsible for cataloguing a sequence of DNA strings (sequences containing only the four letters A, C, G, and T). However, you want to catalog them, not in alphabetical order, but rather in order of ``sortedness'', from ``most sorted'' to ``least sorted''. All the strings are of the same length.
Input
The first line contains two integers: a positive integer n (0 < n <= 50) giving the length of the strings; and a positive integer m (0 < m <= 100) giving the number of strings. These are followed by m lines, each containing a string of length n.
Output
Output the list of input strings, arranged from ``most sorted'' to ``least sorted''. Since two strings can be equally sorted, then output them according to the orginal order.
Sample Input
10 6 AACATGAAGG TTTTGGCCAA TTTGGCCAAA GATCAGATTT CCCGGGGGGA ATCGATGCAT
Sample Output
CCCGGGGGGA AACATGAAGG GATCAGATTT ATCGATGCAT TTTTGGCCAA TTTGGCCAAA
Source
East Central North America 1998
My solution in Java:
要点:
泛型的用法
Arrays.sort()的用法
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
final int len = cin.nextInt();
final int n = cin.nextInt();
cin.nextLine();
List<Dna> list = new ArrayList<Dna>(n);
for (int i = 0; i < n; i++) {
Dna obj = new Dna();
obj.setDna(cin.nextLine());
obj.setInversion(getInversion(obj.getDna(), len));
list.add(obj);
}
cin.close();
ComparatorDna comparator = new ComparatorDna();
Collections.sort(list, comparator);
for (Dna dna : list) {
System.out.println(dna.getDna());
}
}
static int getInversion(String seq, int len) {
int count = 0;
int length = len;
for (int i = 0; i < length - 1; i++) {
for (int j = i + 1; j < length; j++) {
if (seq.charAt(i) > seq.charAt(j)) {
count++;
}
}
}
return count;
}
}
class Dna {
Integer inversion;
public Integer getInversion() {
return inversion;
}
public void setInversion(Integer inversion) {
this.inversion = inversion;
}
String dna;
public String getDna() {
return dna;
}
public void setDna(String dna) {
this.dna = dna;
}
}
class ComparatorDna implements Comparator<Dna> {
@Override
public int compare(Dna o1, Dna o2) {
return o1.getInversion().compareTo(o2.getInversion());
}
}