【华为OJ】【089-DNA序列】

【华为OJ】【算法总篇章】


【华为OJ】【089-DNA序列】

【工程下载】


题目描述

一个DNA序列由A/C/G/T四个字母的排列组合组成。G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次
数除以总的字母数目(也就是序列长度)。在基因工程中,这个比例非常重要。因为高的GC-Ratio可能是基因的起始点。

给定一个很长的DNA序列,以及要求的最小子序列长度,研究人员经常会需要在其中找出GC-Ratio最高的子序列。

输入描述

输入一个string型基因序列,和int型子串的长度

输出描述

找出GC比例最高的字串

输入例子

AACTGTGCACGACCTGA
5

输出例子

GCACG

算法实现

import java.util.Scanner;

/**
 * Author: 王俊超
 * Date: 2016-01-06 15:18
 * All Rights Reserved !!!
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
//        Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));
        while (scanner.hasNext()) {
            String input = scanner.nextLine();
            int n = scanner.nextInt();
            System.out.println(maxRatio(input, n));
        }

        scanner.close();
    }

    /**
     * 初始化两个数组,一个序列数值数组K[N],一个序列和数组SUM[N],先遍历一边序列,
     * 为C或者G则K[i]为1,否则则置为0,然后计算连续M个K[I]之和存入SUM就行。
     *
     * @param s
     * @param m
     * @return
     */
    private static String maxRatio(String s, int m) {
        int[] k = new int[s.length()];
        int[] sum = new int[s.length()];
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == ‘C‘ || c == ‘G‘) {
                k[i]++;
            }
        }

        for (int i = 0; i < k.length - m; i++) {
            for (int j = 0; j < m; j++) {
                sum[i] += k[i + j];
            }
        }

        int max = 0;
        int idx = 0;
        for (int i = 0; i < k.length - 1; i++) {
            if (sum[i] > max) {
                max = sum[i];
                idx = i;
            }
        }

        return s.substring(idx, idx + m);
    }
}
时间: 2024-10-12 08:52:33

【华为OJ】【089-DNA序列】的相关文章

华为OJ平台——DNA序列

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

华为OJ:DNA序列

初始化两个数组,一个序列数值数组K[N],一个序列和数组SUM[N],先遍历一边序列,为C或者G则K[i]为1,否则则置为0,然后计算连续M个K[I]之和存入SUM就行. import java.util.Scanner; public class DNAsquence { public static void main(String args[]){ Scanner input=new Scanner(System.in); String s=input.next(); int n=input

【华为OJ】【091-数据分类处理】

[华为OJ][算法总篇章] [华为OJ][091-数据分类处理] [工程下载] 题目描述 信息社会,有海量的数据需要分析处理,比如公安局分析身份证号码.QQ用户.手机号码.银行帐号等信息及活动记录. 采集输入大数据和分类规则,通过大数据分类处理程序,将大数据分类输出. 输入描述: ?一组输入整数序列I和一组规则整数序列R,I和R序列的第一个整数为序列的个数(个数不包含第一个整数):整数范围为0~0xFFFFFFFF,序列个数不限 输出描述: ?从R依次中取出R<i>,对I进行处理,找到满足条件

【华为OJ】【081-查找两个字符串a,b中的最长公共子串】

[华为OJ][算法总篇章] [华为OJ][081-查找两个字符串a,b中的最长公共子串] [工程下载] 题目描述 查找两个字符串a,b中的最长公共子串 输入描述 输入两个字符串 输出描述 返回重复出现的字符 输入例子 abcdefghijklmnop abcsafjklmnopqrstuvw 输出例子 jklmnop 算法实现 import java.util.Scanner; /** * Author: 王俊超 * Date: 2016-01-04 08:43 * Declaration: A

华为OJ—火车进站(栈,字典排序)

给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列号.其实也就是输出所有可能的出栈序列. 样例输入: 3 1 2 3 样例输出: 1 2 31 3 22 1 32 3 13 2 1 解答: 其实核心就是一个栈,对于第K个数,在第K个数进栈之前,前面的 K-1 个数要么全部出去了,要么都在栈里面,要么部分在栈里面部分出去了.那么可以假想,在第K个数入栈之前,依次从栈里面出去 0个.1个.2个--栈.si

【华为OJ】【090-合唱队】

[华为OJ][算法总篇章] [华为OJ][090-合唱队] [工程下载] 题目描述 计算最少出列多少位同学,使得剩下的同学排成合唱队形 说明: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2-,K,他们的身高分别为T1,T2,-,TK, 则他们的身高满足存在i(1<=i<=K)使得T1<T2<......<Ti-1<Ti>Ti+1>......>

【华为OJ】【071-公共子串计算】

[华为OJ][算法总篇章] [华为OJ][071-公共子串计算] [工程下载] 题目描述 计算两个字符串的最大公共子串的长度,字符不区分大小写 输入描述 输出描述 输入两个字符串 输入例子 asdfas werasdfaswer 输出例子 6 算法实现 import java.util.Arrays; import java.util.Scanner; /** * Author: 王俊超 * Date: 2016-01-04 15:56 * All Rights Reserved !!! */

【华为OJ】【072-火车进站】

[华为OJ][算法总篇章] [华为OJ][072-火车进站] [工程下载] 题目描述 给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车, 每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列号 思路: 此处所谓字典序排序的意思是这n辆火车有多少种出站的可能顺序(也就是数据结构中的栈有多少种出栈顺序). 思路为用三个变量分别存储待进站火车,站中火车和已出站火车,其中待进站火车用Queue(队列)存储和站中 火车采用stack(栈)存储,已出站火车采用St

【华为OJ】【027-字符串运用-密码截取】

[华为OJ][算法总篇章] [华为OJ][027-字符串运用-密码截取] [工程下载] 题目描述 Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信, 比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解. 比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 .因为截获的串太长了, 而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),C