我在处理黑客等级问题。重复字符串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)
}
我收到输入a 1000000000000的错误。
我的代码的输出是<--最后几个GCs ->
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
发布于 2017-10-09 12:27:46
找到一个有效的算法是一个问题。你不能用暴力来解决这些问题。
n
被故意设置为一个很高的值,这样您就不会试图使用暴力。10^12
是1 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
字符,可以重复多少字符串n
。
下面的扰流器(单击/悬停查看答案):
这可以由
Math.floor(n / s.length)
计算。现在,可能会有一些剩余的字符串在末尾,其长度为n % s.length
。所以解决方案是count = Math.floor(n / s.length) * CountAsIn(s) + CountAsIn(s.substring(n % s.length))
发布于 2022-04-27 16:14:45
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;
}
https://stackoverflow.com/questions/46645967
复制相似问题