热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

华为OJ平台——DNA序列

题目描述:一个DNA序列由ACGT四个字母的排列组合组成。G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程中,这个

题目描述:

一个DNA序列由A/C/G/T四个字母的排列组合组成。G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程中,这个比例非常重要。因为高的GC-Ratio可能是基因的起始点。
给定一个很长的DNA序列,以及要求的最小子序列长度,研究人员经常会需要在其中找出GC-Ratio最高的子序列。
输入
  输入一个string型基因序列,和int型子串的长度
输出
  找出GC比例最高的字串
样例输入
  AACTGTGCACGACCTGA 5
样例输出
   GCACG

思路:

最常见和最易想到的方法是直接截取一个长度不小于minLen的子串,然后判断其中的GC-Ratio;确定这个子串是否是GC-Ratio最大的,但是此方法复杂度太高,每次截取子串后又要对子串进行遍历统计。

所以,我提出了下面的方法,对于一个确定的起点,对最长的子串进行一次遍历就可以确定以此为起点的相应的最高的GC-Ratio的子串,这样复杂度有所降低

 1 import java.util.Scanner;
 2 
 3 /**
 4  * 一个DNA序列由A/C/G/T四个字母的排列组合组成。G和C的比例(定义为GC-Ratio)是
 5  * 序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程
 6  * 中,这个比例非常重要。因为高的GC-Ratio可能是基因的起始点。
 7  * 给定一个很长的DNA序列,以及要求的最小子序列长度,研究人员经常会需要在其中找
 8  * 出GC-Ratio最高的子序列
 9  * 
10  * 输入 
11  * 输入一个string型基因序列,和int型子串的长度
12  * 输出 
13  * 找出GC比例最高的字串
14  * 样例输入 AACTGTGCACGACCTGA 5
15  * 样例输出 GCACG
16  *
17  */
18 public class DNASeq {
19 
20     public static void main(String[] args) {
21         // 输入读取参数
22         Scanner cin = new Scanner(System.in);
23         String seq = cin.next();
24         int minLen = cin.nextInt() ;
25         cin.close();                
26         
27         System.out.println(findOpticalSubseq(seq,minLen));
28 
29     }
30 
31     /**
32      * 输入字符串和最小子串长度,返回GC-Ratio最高的子串
33      * @param seq
34      * @param minLen
35      * @return
36      */
37     private static String findOpticalSubseq(String seq, int minLen) {
38         String res ;
39         //记录GC-Ratio最高的子串在字符串seq中的起点和终点
40         int [] index = new int[2] ;   
41         float maxRatio = 0.0f ;
42         int count ;
43         
44         /*
45          * 最常见和最易想到的方法是直接截取一个长度不小于minLen的子串,然后判断其中的GC-Ratio;
46          * 确定这个子串是否是GC-Ratio最大的,但是此方法复杂度太高,每次截取子串后又要对子串进行遍历统计
47          * 所以,我提出了下面的方法,对于一个确定的起点,一次对最长的子串进行一次遍历就可以确定相应的
48          * 最高的GC-Ratio的子串的起点和终点,复杂度有所降低
49          */        
50         for(int i = 0 ; i <(seq.length() - minLen) ; i++){
51             count = 0 ;
52             for(int j = i ; j ){
53                 if(seq.charAt(j) == 'G' || seq.charAt(j) == 'C'){
54                     count++ ;
55                 }
56                 //满足子串长度要求以及GC-Ratio更高的时候更新GC-Ratio和起点和终点的值
57                 if((j-i+1) >= minLen && count/(j-i+1.0f) > maxRatio){
58                     maxRatio = count/(j-i+1.0f) ;
59                     index[0] = i ;
60                     index[1] = j ;
61                 }    
62             }
63         }
64 
65         //根据起点和终点的位置确定返回的子串
66         if(index[1] == (seq.length()-1)){
67             res = seq.substring(index[0]) ;
68         }else{
69             res = seq.substring(index[0], index[1]+1) ;
70         }
71         
72         return res ;
73     }
74 
75 }
Code

 


推荐阅读
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文详细介绍了Java中的访问器(getter)和修改器(setter),探讨了它们在保护数据完整性、增强代码可维护性方面的重要作用。通过具体示例,展示了如何正确使用这些方法来控制类属性的访问和更新。 ... [详细]
  • andr ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
author-avatar
手机用户2602890793
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有