-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGenomicRangeQuery.js
115 lines (85 loc) · 3.69 KB
/
GenomicRangeQuery.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
GenomicRangeQuery
START
Find the minimal nucleotide from a range of sequence DNA.
A DNA sequence can be represented as a string consisting of the letters A, C, G 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 A, C, G 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:
function solution(S, P, Q);
that, given a non-empty string S consisting of N characters and two non-empty arrays P and Q consisting of M integers, returns an array consisting of M integers specifying the consecutive answers to all queries.
Result array should be returned as an array of integers.
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.
Write an efficient algorithm for the following assumptions:
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.
*/
// in the requirment the DNA is consist of this A, C, G and T and the minimal factor for on sequance is 1,2,3,4
function solution (S, P, Q) {
var dna = '';
var ans = [];
for (var i=0; i < P.length; i++) {
dna = S.slice(P[i], Q[i] + 1);
console.log(dna)
if (dna.indexOf('A') !== -1) {
ans.push(1)
} else if (dna.indexOf('C') !== -1) {
ans.push(2)
} else if (dna.indexOf('G') !== -1) {
ans.push(3)
} else {
ans.push(4)
}
}
return ans;
}
const a1= [2,5,0]
const a2=[4,5,6]
const s="CAGCCTA"
console.log(solution(s,a1,a2))
//my bad attempts
/*function solution(S, P, Q) {
// write your code in JavaScript (Node.js 8.9.4)
const mapper =new Map([
["A",1],
["C",2],
["G",3],
["T",4],
])
let overAll=[]
for(var i =0;i<P.length;i++){
let combination
for(let s=P[i];s<=Q[i];s++){
const charcht=S.charAt(s)
if(charcht){
if(!combination){
combination=[]
}
combination.push(mapper.get(charcht))
}
}
if(combination){
combination.sort((a,b)=>a-b)
overAll.push(combination[0])
}
}
return overAll
}
const a1= [2,5,1000]
const a2=[4,5,500]
const s="CAGCCTA"
console.log(solution(s,a1,a2))*/