poj1007

本文介绍了一个基于逆序数计算的DNA字符串排序算法。通过计算字符串中逆序对的数量来评估其排序程度,并据此对一系列固定长度的DNA字符串进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文的翻译参考了http://blog.sina.com.cn/s/blog_61eccf0e0100epql.html


1007 DNA 排序

题目大意:

     序列“未排序程度”的一个计算方式是元素乱序的元素对个数。例如:在单词序列“DAABEC'”中,因为D大于右边四个单词,E大于C,所以计算结果为5。这种计算方法称为序列的逆序数。序列“AACEDGG”逆序数为1(E与D)——近似排序,而序列``ZWQM'' 逆序数为6(它是已排序序列的反序)。

     你的任务是分类DNA字符串(只有ACGT四个字符)。但是你分类它们的方法不是字典序,而是逆序数,排序程度从好到差。所有字符串长度相同。

输入:

第一行包含两个数:一个正整数n(0<n<=50)表示字符串长度,一个正整数m(0<m<=100)表示字符串个数。接下来m行,每行一个长度为n的字符串。

输出:

输出输入字符串列表,按排序程度从好到差。如果逆序数相同,就原来顺序输出。

样例输入:

10 6

AACATGAAGG

TTTTGGCCAA

TTTGGCCAAA

GATCAGATTT

CCCGGGGGGA

ATCGATGCAT

 

样例输出:

CCCGGGGGGA

AACATGAAGG

GATCAGATTT

ATCGATGCAT

TTTTGGCCAA

TTTGGCCAAA

 

来源:

北美中东部1998

http://acm.pku.edu.cn/JudgeOnline/problem?id=1007

后记:希望大家为ACM中文题库做贡献。



import java.util.*;   
  
class DNA   
{   
    private String str = null;   //字符串
    private int sortNum = 0;   //逆序数
       
    public DNA(String input)   
    {   
        str = input;   
           
        int num = 0;
        
        /**
         * for循环的主要逻辑:
         * 计算逆序数
         */
        for(int i = 0; i < str.length()-1; i++)   
        {   
            for(int j = i+1; j < str.length(); j++)   
                if(str.charAt(i) > str.charAt(j))   
                    num++;   
        }   
        sortNum = num;   
    }   
       
    /**
     * getSortNum() .返回逆序数
     * @return
     */
    public int getSortNum()   
    {   
        return sortNum;   
    }   
       
    /**
     * toString().返回字符串
     */
    public String toString()   
    {   
        return str;   
    }   
}   
  
class DNAComparator implements Comparator   
{   

//compare(Object o1, Object o2)
//根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
    public int compare(Object o1, Object o2)   
    {   
        DNA d1 = (DNA)o1;   
        DNA d2 = (DNA)o2;   
           
        /**
         * if···else语句的主要逻辑:
         * 如果
         * 1)d1的逆序数>d2的逆序数,返回1
         * 2)d1的逆序数==d2的逆序数,返回0,,
         * 3)否则,返回-1
         * 
         */
        if(d1.getSortNum() > d2.getSortNum())   
            return 1;   
        else if(d1.getSortNum() == d2.getSortNum())   
            return 0;   
        else  
            return -1;   
    }   
}   
  
public class Main {   
  
    public static void main(String[] args) {   
        Scanner cin = new Scanner(System.in);   
        String[] str = cin.nextLine().split(" ");   
           
        int col = Integer.valueOf(str[0]).intValue();   
        int row = Integer.valueOf(str[1]).intValue();   
        List list = new ArrayList();   
           
        for(int i = 0; i < row; i++)   
        {   
            DNA dna = new DNA(cin.nextLine());   
            list.add(dna);   
        }   
        //sort(List<T> list,Comparator<? super T> c)
        //根据指定比较器产生的顺序对指定列表进行排序
        Collections.sort(list, new DNAComparator());  
        
        print(list);   
    }   
       
    private static void print(List list)   
    {   
        Iterator iter = list.iterator();   
        while(iter.hasNext())   
        {   
            System.out.println(iter.next());   
        }   
    }   
  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅气的东哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值