如何在这个Javascript算法中管理内存?

时间:2016-01-20 00:38:49

标签: javascript algorithm

我对以下问题的解决方案在编译器中给出了正确的答案,但由于以下错误被在线裁判拒绝:JS分配失败 - 处理内存不足。 我应该在算法中更改什么来摆脱这个错误?

Codewars Kata:您必须编写一个函数getAllPrimeFactors,它将一个整数作为参数并返回一个包含其按升序因子进行素数分解的数组,如果一个因子在分解中出现多次,它应该在数组中显示多少次。

例如:

 getAllPrimeFactors(100) returns [2,2,5,5] in this order.

这种分解可能不是最实用的。

你还应该编写getUniquePrimeFactorsWithCount,这个函数将返回一个包含两个数组的数组:一个数字出现在分解中,另一个包含各自的幂。

例如:

getUniquePrimeFactorsWithCount(100) returns [[2,5],[2,2]]

你还应该为getUniquePrimeFactorsWithProducts写一个数组,其中包含各自权力的素因子。

例如:

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;
}

1 个答案:

答案 0 :(得分:0)

你的问题是,如果你被传递0,你进入一个无限循环。你应该把0和负数变成特殊情况。