如何在这个Javascript算法中管理内存?
我对以下问题的解决方案在编译器中给出了正确答案,但由于以下错误被在线法官拒绝:JS分配失败-进程内存不足。 我应该在我的算法中改变什么来消除这个错误 Codewars Kata:您必须编写一个函数getAllPrimeFactors,该函数以整数作为参数,并返回一个数组,该数组包含按升序因子进行的素数分解,如果一个因子在分解中多次出现,则它在数组中的出现次数应与此相同 例如:如何在这个Javascript算法中管理内存?,javascript,algorithm,Javascript,Algorithm,我对以下问题的解决方案在编译器中给出了正确答案,但由于以下错误被在线法官拒绝:JS分配失败-进程内存不足。 我应该在我的算法中改变什么来消除这个错误 Codewars Kata:您必须编写一个函数getAllPrimeFactors,该函数以整数作为参数,并返回一个数组,该数组包含按升序因子进行的素数分解,如果一个因子在分解中多次出现,则它在数组中的出现次数应与此相同 例如: getAllPrimeFactors(100) returns [2,2,5,5] in this order. g
getAllPrimeFactors(100) returns [2,2,5,5] in this order.
getUniquePrimeFactorsWithCount(100) returns [[2,5],[2,2]]
getUniquePrimeFactorsWithProducts(100) returns [4,25]
这种分解可能不是最实际的
您还应该编写GetUniquePrimeFactorWithCount,该函数将返回一个包含两个数组的数组:一个包含分解中出现的素数,另一个包含它们各自的幂
例如:
getAllPrimeFactors(100) returns [2,2,5,5] in this order.
getUniquePrimeFactorsWithCount(100) returns [[2,5],[2,2]]
getUniquePrimeFactorsWithProducts(100) returns [4,25]
您还应该为GetUniquePrimeFactors和Products编写一个数组,该数组包含其各自幂的素数因子
例如:
getAllPrimeFactors(100) returns [2,2,5,5] in this order.
getUniquePrimeFactorsWithCount(100) returns [[2,5],[2,2]]
getUniquePrimeFactorsWithProducts(100) returns [4,25]
错误,如果:
n不是一个数字
n不是整数
n为负或0
这三个函数应该分别返回
[], [[],[]] and [].
边缘情况:
if n=0, the function should respectively return [], [[],[]] and [].
if n=1, the function should respectively return [1], [[1],[1]], [1].
if n=2, the function should respectively return [2], [[2],[1]], [2].
n=2的结果是正常的。n=1的结果是任意的,已选择返回有用的结果。n=0的结果也是任意的,但不能选择既有用又直观的结果
([[0],[0]]
将是有意义的,但不适用于分解的一般用途
[[0],[1]]
可以工作,但不是直观的。)
这是我的算法:
function getAllPrimeFactors(n) {
var fact=[];
while(n%2===0)
{
fact.push(2);
n=n/2;
}
var i=3;
while(i<=Math.floor(Math.sqrt(n)))
{
while(n%i===0)
{
fact.push(i);
n=n/i;
}
i++;
}
if(n>2)
{
fact.push(n);
}
return fact;
}
function getUniquePrimeFactorsWithCount(n) {
var fact=getAllPrimeFactors(n);
var i=0;
var count=[];
var unique=[];
var c=0;
while(i<fact.length)
{
if(fact[i]===fact[i+1])
{
c++;
}
else
{
count.push(c+1);
c=0;
unique.push(fact[i]);
}
i++;
}
var fact_count=[];
fact_count.push(unique);
fact_count.push(count);
return fact_count;
}
function getUniquePrimeFactorsWithProducts(n) {
var fact_count=getUniquePrimeFactorsWithCount(n);
var fact_prod=[];
var i=0;
while(i<fact_count[0].length)
{
var prod=1;
var j=1;
while(j<=fact_count[1][i])
{
prod*=fact_count[0][i];
j++;
}
fact_prod.push(prod);
i++;
}
return fact_prod;
}
函数getAllPrimeFactors(n){
var事实=[];
而(n%2==0)
{
事实。推(2);
n=n/2;
}
var i=3;
while(i2)
{
事实。推(n);
}
返回事实;
}
函数GetUniquePrimeFactorWithCount(n){
var事实=getAllPrimeFactors(n);
var i=0;
var计数=[];
var-unique=[];
var c=0;
虽然(i您的问题是,如果通过0,您将进入一个无止境的循环。在特殊情况下,您应该使用0和负数。有一个输入条件,表示输入大于0@Varun输入条件在哪里?规范说明了什么输入是无效的,以及如果传递了无效输入,将返回什么。您应该ect测试案例,其中您通过了无效的输入,以查看您是否做了正确的事情。现在您没有。您是否有“内存不足”案例的输入数据样本?@Georgy否。在线法官通过了所有案例,但解决方案失败,因为它说运行解决方案需要600多秒,因此很有趣。他们可以给您如果你真的是一个大数字,素数1,或一组非常大的数字,你会尝试寻找年龄的因式分解。同样奇怪的是,他们说
这个分解可能不是最实用的。从数学上讲,这个语句在这里没有任何意义。你最好通过帮助中心询问他们。同时尝试检查0输入。Wild猜猜看,但为什么不呢?)