一、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.

二、问题分析

题意:求输入的一串字母的秩(字母序的规整程度),并按秩由小到大输出字符串。此题的难点不在于求秩,而是再求的秩之后怎么把它和字符串管连起来。由于求得秩之后还要把秩按升序排序,所以关联字符串就比较麻烦了。

三、问题解决

  1. 一开始看到要关联两个值就想到了Map,于是就把秩的值存为键,把字符串存为值。发现要排序,于是就用了TreeMap来自动维护键的顺序。一切进展顺利,以为又轻松解掉一题。刚开始运行给定测试数据的时候,没有问题过了。但是一提交代码,悲剧啊,WA.为什么呢?于是又找了几组测试数据,发现有的测试数据的输出比输入的行数要少。几经测试,发现了一个很容易被忽视的问题,那就是几个字符串的秩很可能是相同的,而我们亲爱的Map的键必须是独一无二的,重复添加相同的键的键值对,Map是不会接受的。好的我刚开始的尝试就这样失败了。

  2. 后来一想,既然键必须唯一,那我就把原来的键值对交换一下了,把秩存入值,用字符串来做键。但又有一个问题,就是如果存在相同的秩,在查找键的过程中,会找到多个键。好像还是不行,但是还是可行的。在遇到有相同的键的情况下,每找到对应值的键后,就把键值对移除,那么在下一个相同秩进行查找是就不会出现上次查找的键了。这样做的过程比较麻烦,还要把秩从Map中分离出来,然后进行排序。之后又要把秩和Map中的值进行关联判断,再输出结果。虽然程序可以运行,并输出结果,但是提交上去发现Runtime error.

  3. 参考了大神的方法,用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(面向对象方法)的更多相关文章

  1. Java面向对象-方法的值传递和引用传递

    Java面向对象-方法的值传递和引用传递 0 发布时间:『 2016-08-21 14:21』  博客类别:Java核心基础  阅读(197) 评论(0) Java面向对象-方法的值传递和引用传递 方 ...

  2. 面向对象方法的重载(overloading)和覆盖(overriding)

    面向对象方法的重载(overloading)和覆盖(overriding). 在有些JAVA书籍中将overriding称为重载,overloading称为过载. Overloading在一个类中可以 ...

  3. Java面向对象-方法的重载

    Java面向对象-方法的重载 所谓方法的重载, 类里面有两个或者多个重名的方法,但是方法的参数个数.类型.顺序至少有一个不一样,这时候局构成方法重载: 上代码: package com.java123 ...

  4. JS面向对象方法(二) 面向对象方法实现橱窗式图面预览以及放大功能

     效果图: HTML结构如下: <div id="preview"> <div id="mediumDiv"> <img id=& ...

  5. Python之面向对象方法

    Python之面向对象方法 property的用法: property属于类的封装的范畴 property是一种特殊的属性,访问它时会执行一段功能(函数),然后返回值. 用property的方法,就可 ...

  6. luogg_java学习_05_面向对象(方法和类)

    这篇总结断断续续写了2天,内容来自Oracle java8编程入门官方教程和课外搜索总结,希望自己以后返回来看的时候都懂,也希望可以起到帮助初学者的作用. 转载请注明 出自 luogg的博客园 , 因 ...

  7. linkin大话面向对象--方法详解

    1,方法的参数传递机制:值传递. 首先弄懂2个概念:形参和实参. 形参(形式参数):相当于函数(Java中也把函数称之为方法)中的局部变量,在函数被调用时创建,并以传入的实参作为起始值,函数调用结束时 ...

  8. 原生JS面向对象方法实现万年历

    ###面向对象的方法实现万年历 实现思路:    1.创建构造函数constructor    ```    function Calender(main){         this.current ...

  9. 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态

    一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...

随机推荐

  1. mongo的时间类型,erlang中对其的处理

    需求:要想在一个调度中,从mongo中查出大于一个时间戳的所有的数据总和. 这个需求很简单,一个是scheduler,还有另一个就是查出来大于某个时间戳的总和,比如大于每天0点时间点的和. 需要注意的 ...

  2. Spring cloud微服务实战——基于OAUTH2.0统一认证授权的微服务基础架构

    https://blog.csdn.net/w1054993544/article/details/78932614

  3. eclipse集成tomcat改动字符集參数

    问题: 在eclipse 4.4(Luna)中集成tomcat时,直接改动原tomcat文件夹中的配置文件,不起作用. 有时.我们会修改字符集參数为utf-8,以解决中文乱码问题,修改之后依旧乱码-- ...

  4. 为什么需要onRoute函数?

    为什么需要onRoute函数? · Tencent/wepy Wiki https://github.com/Tencent/wepy/wiki/%E4%B8%BA%E4%BB%80%E4%B9%88 ...

  5. Tomcat学习笔记【2】--- Tomcat安装、环境变量配置、启动和关闭

    本文主要讲Tomcat的安装和配置. 一 Tomcat安装 1.1 下载 下载地址:http://tomcat.apache.org/ 1.2 安装 Tomcat是不需要安装的,解压压缩包即可. 在安 ...

  6. ES5中的类与继承

    最近在重新复习TypeScript,看到类这块的时候自然会和ES5中的类写法进行对比加深印象. 发现ES5的类与继承一些细节还是挺多的,时间久了容易忘记,特此记录下. 首先是ES5的类定义,这没什么好 ...

  7. 使用 Docker LNMP 部署 PHP 运行环境

    简介 Docker LNMP 是基于 Docker 的 PHP 集成开发环境. Github 地址:https://github.com/YanlongMa/docker-lnmp 包含软件 ngin ...

  8. Java for LeetCode 086

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  9. curl下载安装

    curl下载地址 https://curl.haxx.se/download.html 选择windows generic 下的 下载安装 安装完后解压配置系统环境变量 CURL_HOME      ...

  10. 在Spring中基于JDBC进行数据访问时如何控制超时

    超时分类 超时根据作用域可做如下层级划分: Transaction Timeout > Statement Timeout > JDBC Driver Socket Timeout Tra ...