华为OJ平台——DNA序列

题目描述:

一个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 < seq.length() ; 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

时间: 2024-10-12 16:08:05

华为OJ平台——DNA序列的相关文章

华为OJ平台——字符串分隔

题目描述: 连续输入字符串,请按长度为8拆分每个字符创 后输出到新的字符串数组: 长度不是8整数倍的字符串请在后面补数字0,空字符串不处理 输入 连续输入字符串(输入两次,每个字符长长度小于100)输出 输出到长度为8,的新字符串数组样例输入 abc 123456789样例输出 abc00000 12345678 90000000 思路: 都是直接处理,没有具体的方法而言 注意点: 华为的OJ平台的输入输出有点坑,好多次的程序都在这里出问题,在Eclipse上运行的结果没问题,然后在OJ上就是编

华为OJ平台——矩阵乘法

题目描述: 如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C. 输入: 1.第一个矩阵的行数 2.第一个矩阵的列数(也是第二个矩阵的行数) 3.第二个矩阵的列数 4.第一个矩阵的值 5.第二个矩阵的值 输出: 输出两个矩阵相乘的结果 样例输入 2 2 2 3 8 8 0 9 0 18 9 样例输出 171 72 72 0 思路: 题目意思很简单,只是实现两个矩阵乘法功能,要注意的一点是输出的格式. OJ平台中对输出的格式非常严格,经过多次尝试,验证此

【华为OJ平台练习题】

/* 描述: 输入整型数组和排序标识,对其元素按照升序或降序进行排序 接口说明 原型: void sortIntegerArray(Integer[] pIntegerArray, int iSortFlag); 输入参数: Integer[] pIntegerArray:整型数组 int iSortFlag:排序标识:0表示按升序,1表示按降序 输出参数: 无 返回值: void 输入 1.输入需要输入的整型数个数 2.输入数组组 3.输入排序标识 输出 输出排好序的数字 最后一个无空格 如下

华为OJ平台试题 —— 数组:字符串反转

字符串反转 代码: /* * 接受一个字符串,然后输出该字符串反转后的字符串. */ #include <stdio.h> #include <string.h> /* * 字符串反转函数 */ char *revstr(char *str, int len) { char *start = str; char *end = str + len - 1; char ch; if (str != NULL) { while (start < end) { ch = *start

华为OJ平台——查找组成一个偶数最接近的两个素数

1 import java.util.Scanner; 2 3 /** 4 * 问题描述:任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况, 5 * 本题目要求输出组成指定偶数的两个素数差值最小的素数对,其中 5 < n <= 10000 6 * eg:输入20,输出7 13 7 */ 8 public class PrimePair { 9 10 public static void main(String[] args) { 11 Scanner cin = ne

华为OJ平台——百钱买百鸡问题

题目描述: 元前五世纪,我国古代数学家张丘建在<算经>一书中提出了“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一. 百钱买百鸡,问鸡翁.鸡母.鸡雏各几何? 思路: 这道题很简单,假设鸡翁 i 只, 鸡母 j 只, 则有 i + j + k = 100 5*i + 3*j + k/3 = 100 由以上两个等式我们可以推出: j = 25 - i * 7/4 ; k = 75 + i * 3/4 ; 由于i. j. k 必须是0或正整数,所以 i 必须是4的倍数,因此我们下面的程序中也是

华为OJ平台——字符串通配符

题目描述: 在计算机中,通配符一种特殊语法,广泛应用于文件搜索.数据库.正则表达式等领域.现要求各位实现字符串通配符的算法.要求:实现如下2个通配符: *:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写.下同)(不包含. , 等特殊字符) ?:匹配1个字符 输入 通配符表达式: 一组字符串. 输出 返回匹配的结果,正确输出true,错误输出false 思路: 分三种情况: (1)无通配符的情况:对应的字符要完全相等,否则匹配失败,输出false (2)通配符为?的情况:对应的

华为OJ平台——超长正整数相加

题目描述: 请设计一个算法完成两个超长正整数的加法. 输入 输入两个字符串数字 输出 输出相加后的结果,string型 样例输入 99999999999999999999999999999999999999999999999999 1 样例输出 100000000000000000000000000000000000000000000000000 思路: 在Java中,这样的大数运算可以直接用BigInteger类中的方法来进行运算和处理,那样本题没有任何意义了 因此在本方法中,不直接采用该类中

华为OJ平台——求最大连续bit数

题目描述: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1 输入: 一个byte型的数字    输出: 对应的二进制数字中1的最大连续数 思路: 通过移位运算可以一次判断每一位的0.1值,然后通过统计可以得到结果 import java.util.Scanner; //byte 的范围是-128~127 public class MaxContinueOne { public static void main(String[] args) {