poj 1007 Java AC啦(面向对象思想)

来源:互联网 发布:景安备案域名出售 编辑:程序博客网 时间:2024/06/15 00:34

poj1007题目:http://poj.org/problem?id=1007

偷偷告诉自己:想用Java来写算法题目,以后有实力就参加比赛。。。。。。。

本题还是比较简单的,但是是我第一次用面向对象思想解决。

本题的题目都把我难倒了一会儿,看了半天才知道是什么情况。题目第一句英文,直接把我整蒙了,让我不自觉的看了好几遍第一句话委屈,就像做英语六级阅读一样。


题目意思:输入几个DNA字符串,根据题目,要计算一个DNA的inversions。然后排序输出,就这么简单。

要计算一个DNA字符串的inversions,简单,一个双重for循环轻松搞定。关键问题是,要根据inversions排序,然后来输出DNA。这个让我想了好一会,开始我在想,应该是用Map吧,但是这样就有两种情况:

1.用Map<String,Integer>,那么可以用values()方法得到Integer并且排序,但是输出DNA咋办呢,这可是通过value找key啊,也不是说不可以,但是两个同样的value,找到的key就不一定了,题目要求如果DNA的inversions一样的话按输入的顺序输出,而map是无序的,是通过hash值来存入的,所以并不能满足要求。况且尽量不要通过value找key。

2.用Map<Integer,String>,这个可以用TreeMap直接将Integer排序,Integer就是DNA的inversions。但是Map不允许重复的Integer,如果两个DNA的inversions相同,后面的put不进来,这样会丢失数据。


这两种想来想去,可是把我难住了一会,又不想用复杂的循环来强行用Map存储并排序输出。

最终,突然,想到排序,排序,对了,有Comparable和Comparator啊,就像是数据包装类一样,只要implements Comparable,重写CompareTo方法,就可以排序了,把一个DNA看成一个对象,这样直接根据Collectons.sort方法排序,直接输出。想到了这里,哎,就简单了要命了。

这么简单,兜了一圈,真是惭愧啊。不过刚开始用Java来写算法题目,受到到以前C++的影响,总想着面向过程,老是循环数组什么的,时间长了,禁锢了思想。

已经ac的源码(自己完成,没参考任何人,啦啦啦):

import java.util.ArrayList;import java.util.Collections;import java.util.Scanner;public class Main{public static void main(String[] args) {Scanner sc=new Scanner(System.in);int n,m,index=0;n=sc.nextInt();m=sc.nextInt();String str;ArrayList<DNACount> list=new ArrayList<DNACount>();while(index<m) {str=sc.next();list.add(new DNACount(str));index++;}Collections.sort(list);for(DNACount temp:list) {System.out.println(temp.getDna());}sc.close();}}class DNACount implements Comparable<DNACount>{private String dna;private int count;public String getDna() {return dna;}public DNACount(String dna) {this.dna=dna;int i,j;for(i=0;i<dna.length();i++) {for(j=i+1;j<dna.length();j++) {if(dna.codePointAt(j)<dna.codePointAt(i)) {count++;}}}}@Overridepublic int compareTo(DNACount o) {return this.count-o.count<0?-1:(this.count-o.count==0?0:1);}}

写完直接提交,ac了,哎,前面真是太蠢了。不过这次在记忆里强化了,可以用面向对象嘛,Java本来就是纯面向对象的语言,老在public static void main方法里一直面向过程的写一步一步的,完全不考虑面向对象肯定是不行的。

继续加油喽!!!