Poj1007_DNA Sorting(面向对象方法)
一、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.
二、问题分析
题意:求输入的一串字母的秩(字母序的规整程度),并按秩由小到大输出字符串。此题的难点不在于求秩,而是再求的秩之后怎么把它和字符串管连起来。由于求得秩之后还要把秩按升序排序,所以关联字符串就比较麻烦了。
三、问题解决
一开始看到要关联两个值就想到了Map,于是就把秩的值存为键,把字符串存为值。发现要排序,于是就用了TreeMap来自动维护键的顺序。一切进展顺利,以为又轻松解掉一题。刚开始运行给定测试数据的时候,没有问题过了。但是一提交代码,悲剧啊,WA.为什么呢?于是又找了几组测试数据,发现有的测试数据的输出比输入的行数要少。几经测试,发现了一个很容易被忽视的问题,那就是几个字符串的秩很可能是相同的,而我们亲爱的Map的键必须是独一无二的,重复添加相同的键的键值对,Map是不会接受的。好的我刚开始的尝试就这样失败了。
后来一想,既然键必须唯一,那我就把原来的键值对交换一下了,把秩存入值,用字符串来做键。但又有一个问题,就是如果存在相同的秩,在查找键的过程中,会找到多个键。好像还是不行,但是还是可行的。在遇到有相同的键的情况下,每找到对应值的键后,就把键值对移除,那么在下一个相同秩进行查找是就不会出现上次查找的键了。这样做的过程比较麻烦,还要把秩从Map中分离出来,然后进行排序。之后又要把秩和Map中的值进行关联判断,再输出结果。虽然程序可以运行,并输出结果,但是提交上去发现Runtime error.
参考了大神的方法,用Java的面向对象的方法可以巧妙解决这个关联的问题。把每个字符串看做是一个对象,把秩看出是它的一个属性。而计算秩就放到类中进行。这样就把字符串和秩关联起来了。再用容器把每个DNA对象添加。之后调用Collections.sort(Collection,new compartor);来排序。这里用到了实现了Compartor接口的类,它是强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给 sort 方法(如 或 ),从而允许在排序顺序上实现精确控制。排序之后,只要打印容器即可。应用语言特性来解决这个问题,小弟对您的敬仰如滔滔江水,绵绵不绝;又如黄河之水,一发不可收拾。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner; class DNA{
private int sortNum = 0;
public String str = null; public DNA(String str){
this.str=str;
int num = 0;
char[] c=str.toCharArray();
for(int i=0 ;i < c.length - 1 ;i++){
for(int j=i+1 ;j < c.length ;j++){
if(c[i] > c[j])
num++;
}
}
sortNum=num;
} public int getSortNum(){
return sortNum;
} public String toString(){
return str;
}
} class DNACompartor implements Comparator{ public int compare(Object o1, Object o2) {
DNA a=(DNA) o1;
DNA b=(DNA) o2;
if(a.getSortNum() > b.getSortNum())
return 1;
else if(a.getSortNum() == b.getSortNum())
return 0;
else
return -1;
} }
public class N1007_DNASorting_Version2{ public static void main(String args[]){
Scanner cin =new Scanner(System.in);
int n =cin.nextInt();
int t =cin.nextInt();
ArrayList<DNA> list=new ArrayList<DNA>();
for(int i=0 ;i < t; i++){
DNA a=new DNA(cin.next());
list.add(a);
}
Collections.sort(list, new DNACompartor()); for(DNA s:list){
System.out.println(s.toString());
}
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
Poj1007_DNA Sorting(面向对象方法)的更多相关文章
- Java面向对象-方法的值传递和引用传递
Java面向对象-方法的值传递和引用传递 0 发布时间:『 2016-08-21 14:21』 博客类别:Java核心基础 阅读(197) 评论(0) Java面向对象-方法的值传递和引用传递 方 ...
- 面向对象方法的重载(overloading)和覆盖(overriding)
面向对象方法的重载(overloading)和覆盖(overriding). 在有些JAVA书籍中将overriding称为重载,overloading称为过载. Overloading在一个类中可以 ...
- Java面向对象-方法的重载
Java面向对象-方法的重载 所谓方法的重载, 类里面有两个或者多个重名的方法,但是方法的参数个数.类型.顺序至少有一个不一样,这时候局构成方法重载: 上代码: package com.java123 ...
- JS面向对象方法(二) 面向对象方法实现橱窗式图面预览以及放大功能
效果图: HTML结构如下: <div id="preview"> <div id="mediumDiv"> <img id=& ...
- Python之面向对象方法
Python之面向对象方法 property的用法: property属于类的封装的范畴 property是一种特殊的属性,访问它时会执行一段功能(函数),然后返回值. 用property的方法,就可 ...
- luogg_java学习_05_面向对象(方法和类)
这篇总结断断续续写了2天,内容来自Oracle java8编程入门官方教程和课外搜索总结,希望自己以后返回来看的时候都懂,也希望可以起到帮助初学者的作用. 转载请注明 出自 luogg的博客园 , 因 ...
- linkin大话面向对象--方法详解
1,方法的参数传递机制:值传递. 首先弄懂2个概念:形参和实参. 形参(形式参数):相当于函数(Java中也把函数称之为方法)中的局部变量,在函数被调用时创建,并以传入的实参作为起始值,函数调用结束时 ...
- 原生JS面向对象方法实现万年历
###面向对象的方法实现万年历 实现思路: 1.创建构造函数constructor ``` function Calender(main){ this.current ...
- 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态
一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...
随机推荐
- 【问】Windows下C++局部变量在内存中的分布问题
原本是为了看看C++对象模型中子对象赋值给一个父对象和父类型指针指向的域时,到底会不会切割,就打开codebloks写了下面的代码,编译器选的是GNU. #define DEBUG(X) std::c ...
- Chapter 4 马尔科夫链
4.1 引言 现在要研究的是这样一种过程: 表示在时刻的值(或者状态),想对一串连续时刻的值,比如:,, ... 建立一个概率模型. 最简单的模型就是:假设都是独立的随机变量,但是通常这种假设都是没什 ...
- Linux进入单用户模式
有时候配置linux的过程中,因为一些误操作导致系统初始化时堵塞或挂起而无法进入系统,原因往往是因为配置文件设置错误,部分文件被误删之类.遇到这种情况一般新手的做法就是重装(虚拟机不装白不装),但在实 ...
- 【Caffe】源码解析----caffe.proto (转载)
分析caffe源码,看首先看caffe.proto,是明智的选择.好吧,我不是创造者,只是搬运工. 原文地址:http://blog.csdn.net/qq_16055159/article/deta ...
- uva 12083 Guardian of Decency (二分图匹配)
uva 12083 Guardian of Decency Description Frank N. Stein is a very conservative high-school teacher. ...
- ASP.NET MVC 相关的社群与讨论区
ASP.NET MVC 官方论坛 http://forums.asp.net/1146.aspx 台湾微软MSDN论坛 --- ASP.NET 与 AJAX(ASP.NET AND AJAX)讨论区 ...
- js 检测客户端网速
<!doctype html> <html> <head> <meta http-equiv=Content-Type content="text/ ...
- 九度OJ 1048:判断三角形类型 (基础题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6794 解决:3361 题目描述: 给定三角形的三条边,a,b,c.判断该三角形类型. 输入: 测试数据有多组,每组输入三角形的三条边. 输 ...
- the max number of open files 最大打开文件数 ulimit -n RabbitMQ调优
Installing on RPM-based Linux (RHEL, CentOS, Fedora, openSUSE) — RabbitMQ https://www.rabbitmq.com/i ...
- mysql系列之1.mysql基础
非关系型(NOSQL)数据库 键值存储数据库: memcached / redis / memcachedb / Berkeley db 列存储数据库: Cassandra / Hba ...