zoukankan      html  css  js  c++  java
  • Codility---GenomicRangeQuery

    Task description

    A DNA sequence can be represented as a string consisting of the letters ACG and T, which correspond to the types of successive nucleotides in the sequence. Each nucleotide has an impact factor, which is an integer. Nucleotides of types ACG and T have impact factors of 1, 2, 3 and 4, respectively. You are going to answer several queries of the form: What is the minimal impact factor of nucleotides contained in a particular part of the given DNA sequence?

    The DNA sequence is given as a non-empty string S = S[0]S[1]...S[N-1]consisting of N characters. There are M queries, which are given in non-empty arrays P and Q, each consisting of M integers. The K-th query (0 ≤ K < M) requires you to find the minimal impact factor of nucleotides contained in the DNA sequence between positions P[K] and Q[K] (inclusive).

    For example, consider string S = CAGCCTA and arrays P, Q such that:

    P[0] = 2 Q[0] = 4 P[1] = 5 Q[1] = 5 P[2] = 0 Q[2] = 6

    The answers to these M = 3 queries are as follows:

    • The part of the DNA between positions 2 and 4 contains nucleotides G and C (twice), whose impact factors are 3 and 2 respectively, so the answer is 2.
    • The part between positions 5 and 5 contains a single nucleotide T, whose impact factor is 4, so the answer is 4.
    • The part between positions 0 and 6 (the whole string) contains all nucleotides, in particular nucleotide A whose impact factor is 1, so the answer is 1.

    Write a function:

    class Solution { public int[] solution(String S, int[] P, int[] Q); }

    that, given a non-empty zero-indexed string S consisting of N characters and two non-empty zero-indexed arrays P and Q consisting of M integers, returns an array consisting of M integers specifying the consecutive answers to all queries.

    The sequence should be returned as:

    • a Results structure (in C), or
    • a vector of integers (in C++), or
    • a Results record (in Pascal), or
    • an array of integers (in any other programming language).

    For example, given the string S = CAGCCTA and arrays P, Q such that:

    P[0] = 2 Q[0] = 4 P[1] = 5 Q[1] = 5 P[2] = 0 Q[2] = 6

    the function should return the values [2, 4, 1], as explained above.

    Assume that:

    • N is an integer within the range [1..100,000];
    • M is an integer within the range [1..50,000];
    • each element of arrays P, Q is an integer within the range [0..N − 1];
    • P[K] ≤ Q[K], where 0 ≤ K < M;
    • string S consists only of upper-case English letters A, C, G, T.

    Complexity:

    • expected worst-case time complexity is O(N+M);
    • expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).

    Elements of input arrays can be modified.

    Solution
     
    Programming language used: Java
    Total time used: 55 minutes
    Code: 03:29:35 UTC, java, final, score:  100
    // you can also use imports, for example:
    // import java.util.*;
    
    // you can write to stdout for debugging purposes, e.g.
    // System.out.println("this is a debug message");
    
    class Solution {     
        public int[] solution(String S, int[] P, int[] Q) {
            // write your code in Java SE 8
            int[] res = new int[P.length]; 
            int strLength = S.length();
            if(P.length != Q.length)
                return res;
            int[] A = new int[strLength];
            int[] C = new int[strLength];
            int[] G = new int[strLength];
            int[] T = new int[strLength];    
            switch(S.charAt(0)) {
                case 'A':
                    A[0] = 1;
                    break;
                case 'C':
                    C[0] = 2;
                    break;
                case 'G':
                    G[0] = 3;
                    break;
                case 'T':
                    T[0] = 4;
                    break;
                default:
                    break;
            }
            for(int i=1; i<strLength;i++) {
                switch(S.charAt(i)) {
                    case 'A':
                        A[i] = A[i-1]+1;
                        C[i] = C[i-1];
                        G[i] = G[i-1];
                        T[i] = T[i-1];
                        break;
                    case 'C':
                        A[i] = A[i-1];
                        C[i] = C[i-1] + 2;
                        G[i] = G[i-1];
                        T[i] = T[i-1];
                        break;
                    case 'G':
                        A[i] = A[i-1];
                        C[i] = C[i-1];
                        G[i] = G[i-1] + 3;
                        T[i] = T[i-1];
                        break;
                    case 'T':
                        A[i] = A[i-1];
                        C[i] = C[i-1];
                        G[i] = G[i-1];
                        T[i] = T[i-1] + 4;
                        break;
                    default:
                        break;
                }
            }
            for(int i=0; i<P.length; i++) {
                if(P[i] == 0) {
                    if(A[Q[i]] > 0)
                        res[i] =1;
                    else if(C[Q[i]] > 0)
                        res[i] =2;
                    else if(G[Q[i]] > 0)
                        res[i] =3;
                    else if(T[Q[i]] > 0)
                        res[i] =4;
                    
                }else {
                    if(A[Q[i]] - A[P[i]-1] > 0)
                        res[i] = 1;
                    else if(C[Q[i]] - C[P[i]-1] > 0)
                        res[i] = 2;
                    else if(G[Q[i]] - G[P[i]-1] > 0)
                        res[i] = 3;
                    else if(T[Q[i]] - T[P[i]-1] > 0)
                        res[i] = 4;
                }
            }
            return res;
        }
    }



    https://codility.com/demo/results/trainingMDKFSG-J57/
  • 相关阅读:
    107. 二叉树的层次遍历 II
    106. 从中序与后序遍历序列构造二叉树
    105. 从前序与中序遍历序列构造二叉树
    【Python基础编程029 ● 判断语句和循环语句 ● while循环嵌套 】
    【Python基础编程028 ● 判断语句和循环语句 ● continue的用法 】
    【Python基础编程027 ● 判断语句和循环语句 ● break的用法 】
    【Python基础编程026 ● 判断语句和循环语句 ● 使用while语句求累加和 】
    【Python基础编程025 ● 判断语句和循环语句 ● while循环语句 】
    【Python基础编程024 ● 判断语句和循环语句 ● 使用if语句实现三目运算符】
    登录页面二次跳转的案例
  • 原文地址:https://www.cnblogs.com/samo/p/6780830.html
Copyright © 2011-2022 走看看