【问题标题】:How to deal with large number inside of for loop in javascript?如何处理javascript中for循环内的大量数字?
【发布时间】:2018-03-20 15:14:00
【问题描述】:

我正在研究黑客等级问题。 重复字符串 [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)
}

我收到输入错误 一种 1000000000000

我的代码的输出是

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 堆栈跟踪 ========================================== =

安全上下文:0x10178c2cfb51 2: 主要 [/run-N6KBYU8cQzCneXKH0Tbm/solution.js:~30] [pc=0x2859725aec0] (this=0x10178c2e6119) 3: /* 匿名 */ [/run-N6KBYU8cQzCneXKH0Tbm/solution.js:21] [pc=0x2859725717e] (this=0x2af8d3a77e81) 4: emitNone(aka emitNone) [events.js:91] [pc=0x28597256c33] (this=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::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

【问题讨论】:

  • 提示:这个问题不用实际生成和遍历字符串就可以解决。
  • 那个挑战看起来像 C,是把 C 转换成 JavaScript 的挑战吗?

标签: javascript for-loop infinite-loop


【解决方案1】:

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

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 不能给他们这么多资源。

问题从未打算让您将此值存储在内存中。目的是让您找到一种巧妙的方法来解决它,而无需存储所有值。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    相关资源
    最近更新 更多