POJ_1007_DNASorting分析

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;
				}
			}
			
		});
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值