给出字符串s
,将其分配n
次,长度为x。示例:如果n = 7
和s = "ada"
,则最后一个字符串为adaadaa
。最后,计算字符串中a
的数量。
我的解决方案可以在下面找到。除API fatal error handler returned after process out of memory
或更高时遇到n = 10000000
错误外,它工作正常。
这是为什么?如果n=100000
正常工作,会导致JavaScript的字符串操作用尽,这是怎么回事?它与引擎试图赋予它int类型(而它应该很长)有关吗?
const s = "a";
const n = 100000000;
let count = 0;
let output = "";
for (let i = 0; i < n; i++) {
if (count % s.length == 0) {
count = 0;
}
output += s[count];
count++;
}
let finalCount = 0;
let arr = output.split('');
for (let i = 0; i < arr.length; i++) {
if (arr[i] == 'a') {
finalCount++;
}
}
console.log(finalCount);
答案 0 :(得分:2)
有关javascript中导致其内存不足的字符串操作是什么?
您只是在构建一个巨大的巨大字符串。这样的字符串需要驻留在内存中的某个位置。您的字符串太大。
您可以优化算法,使其不需要那么大的字符串(在此示例中,我什至也认为它是简化):
const s = "a";
const n = 100000000;
let count = 0;
let finalCount = 0;
for (let i = 0; i < n; i++) {
if (count % s.length == 0) {
count = 0;
}
if (s[count] == 'a') {
finalCount++;
}
count++;
}
console.log(finalCount);
(您可以进一步优化,使其在n
之前不需要循环,但可以在O(s.length)
中运行,但这对于减少内存使用量不是必需的。)
答案 1 :(得分:0)
您还可以增加nodejs的最大内存大小,默认情况下将其设置为1 gb,有关如何增加大小的信息,请参见下面的链接。您已经达到了极限,它的nodejs极限不是JavaScript极限。
https://medium.com/@vuongtran/how-to-solve-process-out-of-memory-in-node-js-5f0de8f8464c
此外, 在您的第一个for循环中,您有一条if语句,用于检查count(在第一个循环后等于1)除以1的余数是否为1,如果是,则将count设置为0,然后在输出中添加“ a”然后将count设置为1,以使整个循环再次运行。