如何在javascript中处理for循环中的大量数字?

时间:2017-10-09 12:00:58

标签: javascript for-loop infinite-loop

我正在研究黑客等级问题。 重复的字符串 [1]:https://www.hackerrank.com/challenges/repeated-string/problem

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)
}

我收到输入错误 一个 万亿

我的代码的输出是 &lt; ---最后几个GC ---&gt;

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].

&lt; --- JS stacktrace ---&gt;

==== JS堆栈跟踪======================================== =

  

安全上下文:0x10178c2cfb51       2:main [/run-N6KBYU8cQzCneXKH0Tbm/solution.js:~30] [pc = 0x2859725aec0](这= 0x10178c2e6119)       3:/ *匿名* / [/run-N6KBYU8cQzCneXKH0Tbm/solution.js:21] [pc = 0x2859725717e](这= 0x2af8d3a77e81)       4:emitNone(aka emitNone)[events.js:91] [pc = 0x28597256c33](这= 0x10178c204381​​,handler = 0x2af8d3a78049,是......

此代码的错误是

  

致命错误:CALL_AND_RETRY_LAST分配失败 - JavaScript堆   内存不足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 ::内部::厂:: 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

1 个答案:

答案 0 :(得分:1)

找到一个有效的算法是个问题。你不能用蛮力来解决这些问题。

故意将

n设置为高值,这样您就不会尝试暴力。 10^121 Trillion,即使您可以在one nano second中运行循环的每次迭代,也需要1000 seconds,这很长,因为在{{}}中无法运行每次迭代{1}}。

您遇到的问题是由于one nano second,您试图在内存中存储Space complexity(最大值)字符。如果每个字符都需要(n=10^12),那么我们需要的内存大小是

1 byte

我确信你的程序不会给你那个记忆。鉴于必须有其他人同时试图解决这个问题。 10^12 bytes = 1000 Giga bytes = 1 Terra byte 无法为所有人提供这么多资源。

问题从未打算将此值存储在内存中。有意为您找到一种解决问题的聪明方法,而无需存储所有值。

现在聪明的方法是,您可以计算Hackerranka的数量s。现在您要做的就是找出如果您只有s个字符,可以重复多少个字符串n

下面的剧透(点击/悬停以查看答案):

  

这可以由Math.floor(n / s.length)计算。现在可能在末尾有一些剩余的字符串,其长度为n % s.length。所以解决方案是count = Math.floor(n / s.length) * CountAsIn(s) + CountAsIn(s.substring(n % s.length))