2017-10-09 73 views
0

我正在研究黑客等級問題。 重複的字符串 [1]:https://www.hackerrank.com/challenges/repeated-string/problem如何處理javascript中for循環的大量內部?

function main() { 
    var s = readLine(); 
    var n = parseInt(readLine()); 
    var rep = 0; 
    var repArray = [] 

//calculate each case 

    while(repArray.length < n){ 
     for(let j = 0; j < s.length; j++){ 
      if(repArray.length > n){ 
       break; 
     } 
      repArray.push(s[j]) 
     } 
    } 

    for(let a = 0; a < repArray.length; a++){ 
    if(repArray[a] === 'a'){ 
      rep++ 
     } 
    } 
    console.log(rep) 
} 

我接收到錯誤的輸入 一個 萬億

我的代碼的輸出是 < ---過去幾年的GC --->

1836 ms: Mark-sweep 597.4 (605.3) -> 359.7 (368.6) MB, 101.7/0.0 ms [allocation failure] [GC in old space requested]. 
1938 ms: Mark-sweep 359.7 (368.6) -> 359.7 (368.6) MB, 102.3/0.0 ms [allocation failure] [GC in old space requested]. 
2040 ms: Mark-sweep 359.7 (368.6) -> 359.7 (367.6) MB, 101.6/0.0 ms [last resort gc]. 
2142 ms: Mark-sweep 359.7 (367.6) -> 359.7 (367.6) MB, 101.7/0.0 ms [last resort gc]. 

< --- JS堆棧跟蹤--->

==== JS堆棧跟蹤=========================================

Security context: 0x10178c2cfb51 2: main [/run-N6KBYU8cQzCneXKH0Tbm/solution.js:~30] [pc=0x2859725aec0] (this=0x10178c2e6119) 3: /* anonymous */ [/run-N6KBYU8cQzCneXKH0Tbm/solution.js:21] [pc=0x2859725717e] (this=0x2af8d3a77e81) 4: emitNone(aka emitNone) [events.js:91] [pc=0x28597256c33] (this=0x10178c204381 ,handler=0x2af8d3a78049 ,is...

這段代碼的錯誤是

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 1: node::Abort() [/usr/local/nodejs-binary/bin/node] 2: 0x1098b2c [/usr/local/nodejs-binary/bin/node] 3: v8::Utils::ReportApiFailure(char const*, char const*) [/usr/local/nodejs-binary/bin/node] 4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [/usr/local/nodejs-binary/bin/node] 5: v8::internal::Factory::NewUninitializedFixedArray(int) [/usr/local/nodejs-binary/bin/node] 6: 0xc4553f [/usr/local/nodejs-binary/bin/node] 7: v8::internal::Runtime_GrowArrayElements(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/local/nodejs-binary/bin/node] 8: 0x285971079a7

+2

提示:這個問題可以不用實際生成和遍歷字符串來解決。 – Quelklef

+0

這個挑戰看起來像C,是將C轉換成JavaScript的挑戰嗎? – zer00ne

回答

0

這是找到一個有效的算法有問題。你不能用暴力來解決這類問題。

n有意設置爲較高的值,以免您嘗試暴力。 10^121 Trillion,即使您可以在one nano second中運行循環的每次迭代,它也會花費1000 seconds,由於不可能在one nano second中運行每次迭代,所以這是很長的。

您面臨的問題是由於Space complexity,您試圖將(n=10^12)(最大值)字符存儲在內存中。如果每個字符佔用1 byte隨後的內存,我們需要的大小是

10^12 bytes = 1000 Giga bytes = 1 Terra byte 

我敢肯定,你的程序將不會被考慮到內存。鑑於那裏一定有其他人試圖同時解決這個問題。 Hackerrank不能把這麼多的資源給所有人。

問題從未打算讓您將此值存儲在內存中。意圖是你找到一個聰明的解決方法,而不需要存儲所有的值。

現在聰明的方法是,你可以統計有多少a s在s。現在,您只需找出有多少個字符串s即可只有n個字符。下面

擾流器(點擊/懸停查看答案):

That can be caculated by Math.floor(n/s.length) . Now there may be some remaining string at the end which has length n % s.length . So the solution would be count = Math.floor(n/s.length) * CountAsIn(s) + CountAsIn(s.substring(n % s.length))