POJ_1007_DNASorting分析
DNA序列由四个字母的组合来表示,四个字母分别是A、C、G、T。每个序列都可以定义一个无序的度,比如GCA的无序度为3,计算方法为:G比后面2字母大,C比后面1个字母大,因此GCA的无序度为3。
输入要求:
第一行输入两个数字,第一个数字表示序列的长度,第二个数字表示序列的个数,如下:
10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT
输出要求:
按DNA序列的无序度由低到高输出,如果DNA无序度相同,则按输入的先后顺序输出。
这道题可分为两个部分,第一,计算DNA序列的无序度;第二,根据DNA序列的无序度进行排序。
计算DNA序列无序度的时候,如果该字母和前一字母相同,那么其无序度也和前一字母的相同,可以直接娶前一个字母的无序度值,减少计算量。
排序的时候由于数据量较小,所以选择什么排序都可以,推荐希尔排序。使用java的同学可以直接调用Arrays中的sort()方法。
Arrays.<String>sort(strArray, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
int len = o1.length();
int[] v1 = new int[len];
int[] v2 = new int[len];
char c1 = o1.charAt(0);
char c2 = o2.charAt(0);
for (int i = 1; i < len; i++) {
if (c1 - o1.charAt(i) > 0) v1[0]++;
if (c2 - o2.charAt(i) > 0) v2[0]++;
}
int value1 = v1[0], value2 = v2[0];
for (int i = 1; i < len; i++) {
if (o1.charAt(i) - o1.charAt(i - 1) == 0) {
v1[i] = v1[i - 1];
value1 += v1[i-1];
continue;
}
if (i == len - 1) {
v1[i] = 0;
break;
}
if (o1.charAt(i) == 'A') {
v1[i] = 0;
continue;
}
for (int j = i; j < len; j++) {
if (o1.charAt(i) - o1.charAt(j) > 0) v1[i]++;
}
value1 += v1[i];
}
for (int i = 1; i < len; i++) {
if (o2.charAt(i) - o2.charAt(i - 1) == 0) {
v2[i] = v2[i - 1];
value2 += v2[i - 1];
continue;
}
if (i == len - 1) {
v2[i] = 0;
break;
}
if (o2.charAt(i) == 'A') {
v2[i] = 0;
continue;
}
for (int j = i; j < len; j++) {
if (o2.charAt(i) - o2.charAt(j) > 0) v2[i]++;
}
value2 += v2[i];
}
System.out.printf("%s, length:%d %s, length:%d\n", o1, value1, o2, value2);
if (value1 < value2) {
return -1;
} else if (value1 == value2) {
return 0;
} else {
return 1;
}
}
});