איך האב שוין געטראפן א דזשאב במילא ווייס איך נישט וויפיהל צייט איך וועל האבן צו ווייטער ממשיך זיין און ס'זעט אויך נישט אויס אז איינער חוץ
@מי אני איז אינטרעסירט אבער פאר מיין אייגענע טובה, צו בלייבן שארף, וועל איך פרובירן פון צייט צו צייט צו פאוסטן.
Solution #9
באזירט אויף Prefix sums method, א קאנצעפט דעסקרייבד דא: <a class="postlink" href="https://codility.com/media/train/3-PrefixSums.pdf">https://codility.com/media/train/3-PrefixSums.pdf</a>
די עקשועל [עפישענט] סעלושן האב איך נישט געקענט אויספיגערן ביז איך האב געקוקט דא: <a class="postlink" href="https://stackoverflow.com/questions/19552754/java-codility-training-genomic-range-query">https://stackoverflow.com/questions/195 ... ange-query</a>
מיין סעלושן איז בעיסיקלי די ערשטע ענטפער אין דער טרעד^ נאר כ'האב גענוצט א צווייטע דאטא סטרוקטור און מיט א סלייטלי דיפערענט צוגאנג.
[code=php]<span class="syntaxdefault"> public static int</span><span class="syntaxkeyword">[]</span><span class="syntaxdefault"> solution</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">string S</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> int</span><span class="syntaxkeyword">[]</span><span class="syntaxdefault"> P</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> int</span><span class="syntaxkeyword">[]</span><span class="syntaxdefault"> Q</span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault"> </span><span class="syntaxcomment">//Foreach character in S, we're going to add an element/tuple of 3 entries to 'prefixSums'. The elements in 'prefixSums' will indicate how many As, Cs, Gs and Ts we found in the string, <br /></span><span class="syntaxdefault"> </span><span class="syntaxcomment">// with each entry in the tuple indicating a different letter, A, C and G respectively. (See later what we do about T).<br /></span><span class="syntaxdefault"> </span><span class="syntaxcomment">// So, for 3 of these 4 different characters, A C G and T, we have counters that we'll bump up each time we encounter one. One counter for each character. (0, 1, 2) = (A, C, G).<br /></span><span class="syntaxdefault"> </span><span class="syntaxcomment">// By bumping up the relevant counter for each occurrence of the letter it is associated with, they'll in the end serve as accumulators for how many times we encountered the relevant character in the string.<br /></span><span class="syntaxdefault"> </span><span class="syntaxcomment">// Every letter we move forward, we add a new element to 'prefixSums' and have all the counters in the new element take on (we assign to them) the values of the previous counter at their respective positions,<br /></span><span class="syntaxdefault"> </span><span class="syntaxcomment">// as well as adding a 1 if the letter that's associated with 'this' counter is found at the current position and a 0 if not. <br /></span><span class="syntaxdefault"> </span><span class="syntaxcomment">//To answer the queries, we find out for a given S[P[K]] to S[Q[K]] the minimal factor within this boundary, by subtracting the counter at element P[K] in 'prefixSums' <br /></span><span class="syntaxdefault"> </span><span class="syntaxcomment">// [for the relevant factor/letter - i.e. starting from lowest to highest, that is index (firstIndex, second, third)] <br /></span><span class="syntaxdefault"> </span><span class="syntaxcomment">// from the counter at the same position in element Q[K] in 'prefixSums', to see if we're left with a number more or equal to 1. This will tell us, that in between these two positions in S, a letter associated with the factor of this value [i.e. 1, 2, or 3] was found<br /></span><span class="syntaxdefault"> </span><span class="syntaxcomment">//For the forth character T (i.e. factor 4), we don't need a separate counter as we can indicate its occurrence by merely adding a new element to 'prefixSums' where all the counters remain unchanged from the previous element in 'prefixSums'.<br /><br /></span><span class="syntaxdefault"> List</span><span class="syntaxkeyword"><</span><span class="syntaxdefault">Tuple</span><span class="syntaxkeyword"><</span><span class="syntaxdefault">int</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> int</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> int</span><span class="syntaxkeyword">>></span><span class="syntaxdefault"> prefixSums </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> new List</span><span class="syntaxkeyword"><</span><span class="syntaxdefault">Tuple</span><span class="syntaxkeyword"><</span><span class="syntaxdefault">int</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> int</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> int</span><span class="syntaxkeyword">>>()</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{</span><span class="syntaxdefault"> Tuple</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">Create</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">};<br /></span><span class="syntaxdefault"> int</span><span class="syntaxkeyword">[]</span><span class="syntaxdefault"> minimalIF </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> new int</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">P</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">Length</span><span class="syntaxkeyword">];<br /><br /><br /><br /><br /></span><span class="syntaxdefault"> var i </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault"> foreach </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">var ch in S</span><span class="syntaxkeyword">)<br /><br /></span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault"> Console</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">WriteLine</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">Count</span><span class="syntaxkeyword">());<br /></span><span class="syntaxdefault"> switch </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">ch</span><span class="syntaxkeyword">)</span><span class="syntaxcomment">//here the string is traversed, and the counters are set accordingly<br /></span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault"> case </span><span class="syntaxstring">'A'</span><span class="syntaxkeyword">:<br /></span><span class="syntaxdefault"> prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">Add</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">Tuple</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">Create</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">1 </span><span class="syntaxkeyword">+</span><span class="syntaxdefault"> prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">ElementAt</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">).</span><span class="syntaxdefault">Item1</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">ElementAt</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">).</span><span class="syntaxdefault">Item2</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">ElementAt</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">).</span><span class="syntaxdefault">Item3</span><span class="syntaxkeyword">));<br /></span><span class="syntaxdefault"> break</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault"> case </span><span class="syntaxstring">'C'</span><span class="syntaxkeyword">:<br /></span><span class="syntaxdefault"> prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">Add</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">Tuple</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">Create</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">ElementAt</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">).</span><span class="syntaxdefault">Item1</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 1 </span><span class="syntaxkeyword">+</span><span class="syntaxdefault"> prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">ElementAt</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">).</span><span class="syntaxdefault">Item2</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">ElementAt</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">).</span><span class="syntaxdefault">Item3</span><span class="syntaxkeyword">));<br /></span><span class="syntaxdefault"> break</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault"> case </span><span class="syntaxstring">'G'</span><span class="syntaxkeyword">:<br /></span><span class="syntaxdefault"> prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">Add</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">Tuple</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">Create</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">ElementAt</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">).</span><span class="syntaxdefault">Item1</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">ElementAt</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">).</span><span class="syntaxdefault">Item2</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 1 </span><span class="syntaxkeyword">+</span><span class="syntaxdefault"> prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">ElementAt</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">).</span><span class="syntaxdefault">Item3</span><span class="syntaxkeyword">));<br /></span><span class="syntaxdefault"> break</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault"> default</span><span class="syntaxkeyword">:<br /></span><span class="syntaxdefault"> prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">Add</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">Tuple</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">Create</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">ElementAt</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">).</span><span class="syntaxdefault">Item1</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">ElementAt</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">).</span><span class="syntaxdefault">Item2</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">ElementAt</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">i</span><span class="syntaxkeyword">).</span><span class="syntaxdefault">Item3</span><span class="syntaxkeyword">));<br /><br /></span><span class="syntaxdefault"> break</span><span class="syntaxkeyword">;<br /><br /></span><span class="syntaxdefault"> </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault"> i</span><span class="syntaxkeyword">++;<br /></span><span class="syntaxdefault"> </span><span class="syntaxkeyword">}<br /><br /></span><span class="syntaxdefault"> foreach </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">var p in prefixSums</span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault"> Console</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">WriteLine</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">p</span><span class="syntaxkeyword">);<br /><br /></span><span class="syntaxdefault"> for </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">int j </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">;</span><span class="syntaxdefault"> j </span><span class="syntaxkeyword"><</span><span class="syntaxdefault"> P</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">Length</span><span class="syntaxkeyword">;</span><span class="syntaxdefault"> j</span><span class="syntaxkeyword">++)</span><span class="syntaxcomment">//here we answer the queries<br /></span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault"> if </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">ElementAt</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">Q</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">j</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">+</span><span class="syntaxdefault"> 1</span><span class="syntaxkeyword">).</span><span class="syntaxdefault">Item1 </span><span class="syntaxkeyword">-</span><span class="syntaxdefault"> prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">ElementAt</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">P</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">j</span><span class="syntaxkeyword">]).</span><span class="syntaxdefault">Item1 </span><span class="syntaxkeyword">></span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault"> minimalIF</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">j</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> 1</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault"> else if </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">ElementAt</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">Q</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">j</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">+</span><span class="syntaxdefault"> 1</span><span class="syntaxkeyword">).</span><span class="syntaxdefault">Item2 </span><span class="syntaxkeyword">-</span><span class="syntaxdefault"> prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">ElementAt</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">P</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">j</span><span class="syntaxkeyword">]).</span><span class="syntaxdefault">Item2 </span><span class="syntaxkeyword">></span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault"> minimalIF</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">j</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> 2</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault"> else if </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">ElementAt</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">Q</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">j</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">+</span><span class="syntaxdefault"> 1</span><span class="syntaxkeyword">).</span><span class="syntaxdefault">Item3 </span><span class="syntaxkeyword">-</span><span class="syntaxdefault"> prefixSums</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">ElementAt</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">P</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">j</span><span class="syntaxkeyword">]).</span><span class="syntaxdefault">Item3 </span><span class="syntaxkeyword">></span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault"> minimalIF</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">j</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> 3</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault"> else<br /> minimalIF</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">j</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> 4</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault"> </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault"> return minimalIF</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault"> </span><span class="syntaxkeyword">} </span><span class="syntaxdefault"></span>[/code]