本文的翻译参考了http://blog.sina.com.cn/s/blog_61eccf0e0100epql.html
1007
题目大意:
输入:
第一行包含两个数:一个正整数n(0<n<=50)表示字符串长度,一个正整数m(0<m<=100)表示字符串个数。接下来m行,每行一个长度为n的字符串。
输出:
输出输入字符串列表,按排序程度从好到差。如果逆序数相同,就原来顺序输出。
样例输入:
10
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT
样例输出:
CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA
来源:
北美中东部1998
http://acm.pku.edu.cn/JudgeOnline/problem?id=1007
后记:希望大家为ACM中文题库做贡献。
import java.util.*;
class DNA
{
private String str = null; //字符串
private int sortNum = 0; //逆序数
public DNA(String input)
{
str = input;
int num = 0;
/**
* for循环的主要逻辑:
* 计算逆序数
*/
for(int i = 0; i < str.length()-1; i++)
{
for(int j = i+1; j < str.length(); j++)
if(str.charAt(i) > str.charAt(j))
num++;
}
sortNum = num;
}
/**
* getSortNum() .返回逆序数
* @return
*/
public int getSortNum()
{
return sortNum;
}
/**
* toString().返回字符串
*/
public String toString()
{
return str;
}
}
class DNAComparator implements Comparator
{
//compare(Object o1, Object o2)
//根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
public int compare(Object o1, Object o2)
{
DNA d1 = (DNA)o1;
DNA d2 = (DNA)o2;
/**
* if···else语句的主要逻辑:
* 如果
* 1)d1的逆序数>d2的逆序数,返回1
* 2)d1的逆序数==d2的逆序数,返回0,,
* 3)否则,返回-1
*
*/
if(d1.getSortNum() > d2.getSortNum())
return 1;
else if(d1.getSortNum() == d2.getSortNum())
return 0;
else
return -1;
}
}
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
String[] str = cin.nextLine().split(" ");
int col = Integer.valueOf(str[0]).intValue();
int row = Integer.valueOf(str[1]).intValue();
List list = new ArrayList();
for(int i = 0; i < row; i++)
{
DNA dna = new DNA(cin.nextLine());
list.add(dna);
}
//sort(List<T> list,Comparator<? super T> c)
//根据指定比较器产生的顺序对指定列表进行排序
Collections.sort(list, new DNAComparator());
print(list);
}
private static void print(List list)
{
Iterator iter = list.iterator();
while(iter.hasNext())
{
System.out.println(iter.next());
}
}
}