首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何处理javascript中for循环中的大量数据?

如何处理javascript中for循环中的大量数据?
EN

Stack Overflow用户
提问于 2017-10-09 12:00:57
回答 2查看 1.3K关注 0票数 0

我在处理黑客等级问题。重复字符串1:https://www.hackerrank.com/challenges/repeated-string/problem

代码语言:javascript
运行
复制
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)
}

我收到输入a 1000000000000的错误。

我的代码的输出是<--最后几个GCs ->

代码语言:javascript
运行
复制
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堆栈跟踪=========================================

安全上下文: 0x10178c2cfb51 2: main /run-N6KBYU8CzCneXKH0Tbm/溶质.is:~30 (this=0x10178c2e6119 ) 3: /*匿名*/运行-N6KBYU8cQzCneXKK0Tbm/溶质.is:21 (this=0x2af8d3a77e81 ) 4: emitNone(又名emitNone) events.js:91 (this=0x10178c204381,handler=0x2af8d3a78049 )

此代码的错误是

致命错误:内存中的CALL_AND_RETRY_LAST堆失败1:节点: JavaScript ()/usr/local/nodejs-二进制/bin/节点2: 0x1098b2c /usr/JavaScript/nodejs-二进制/bin/节点3: V8:Utils::ReportApiFailure( const*,const*) /usr/local/nodejs-二进制/bin/节点4:bool) /usr/local/nodejs-二进制/bin/节点5: v8::internal::Factory::NewUninitializedFixedArray(int) /usr/local/nodejs-二进制/bin/节点6: 0xc4553f /usr/local/nodejs-二进制/bin/节点7: v8::internal::Runtime_GrowArrayElements(int,V8:内部::Object**,V8:内部:内部:隔离*)/usr/本地/nodejs-二进制/bin/节点8: 0x285971079a7

EN

回答 2

Stack Overflow用户

发布于 2017-10-09 12:27:46

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

n被故意设置为一个很高的值,这样您就不会试图使用暴力。10^121 Trillion,即使您可以在one nano second中运行循环的每一次迭代,它也会采用1000 seconds,这很久以来,在one nano second中不可能运行每一次迭代。

您所面临的问题是由于Space complexity,您试图在内存中存储(n=10^12) (最大值)字符。如果每个字符都采用1 byte,那么我们需要的内存大小是

代码语言:javascript
运行
复制
10^12 bytes = 1000 Giga bytes = 1 Terra byte

我相信你的程序不会有那样的记忆。考虑到其他人必须同时解决这个问题。Hackerrank不能给他们提供这么多的资源。

问题从来不想让您将此值存储在内存中。意图是让你找到一个聪明的方法来解决它,而不需要存储所有的价值。

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

下面的扰流器(单击/悬停查看答案):

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

票数 1
EN

Stack Overflow用户

发布于 2022-04-27 16:14:45

代码语言:javascript
运行
复制
function getAOcc (s) {
  return s.match(/a/g)?.length || 0;
}

function repeatedString(s, n) {
  // Write your code here
  let stringLength = s.length;
  let aOcc = 0;
  const actualAOcc = getAOcc(s);
  
  if (!actualAOcc) return 0;
  
  const totalRep = Math.floor(n / stringLength);
  
  aOcc = actualAOcc * totalRep;
  
  const modS = n % stringLength
  if (modS > 0) {
      aOcc += getAOcc(s.substring(0, modS));
  }
  
  return aOcc;
}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46645967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档