找到没有重复的数字的所有排列(为清晰起见编辑)

时间:2015-05-17 05:08:01

标签: javascript arrays recursion duplicates

我已经从Coderbyte那里完成了这个挑战,但是非常优秀:

  

让PrimeChecker(num)函数取num并返回1(如果有的话)   num的排列是素数,否则返回0。   例如:如果num为910,则输出应为1,因为910可以   排列成109或019,两者都是素数。

我的解决方案是通过生成num参数中所有可能的数字排列数组,然后将其扫描为素数:

function PrimeChecker(num) {
    // Accounting for 1 not being a prime number by definition
    if (num == 1) {
        return 0;
    }
    // Defining an empty array into which all permutations of num will be put
    var resultsArray = [];
    // Breaking num into an array of single-character strings
    var unchangedArray = num.toString().split('');
    // Function to push all permutations of num into resultsArray using recursion
    function getAllCombos (array, count) {
        if (count === num.toString().length) {
            return;
        }
        else {
            for (var i = 0; i < array.length; i++) {
                var temp = array[count];
                array[count] = array[i];
                array[i] = temp;
                resultsArray.push(array.join(''));
            }
            return getAllCombos(array, count+1) || getAllCombos(unchangedArray, count+1);
        }
    }

    getAllCombos(unchangedArray, 0);

    // Converting the results from strings to numbers and checking for primes
    var numArr = [];
    resultsArray.forEach(function(val, indx) {
        return numArr[indx] = Number(val);
    });

    for (var i = 0; i < numArr.length; i++) {
        var prime = 1;
        for (var j = 2; j < numArr[i]; j++) {
            if (numArr[i] % j == 0) {
                prime = 0;
            }
        }
        if (prime == 1) {
            return prime;
        }
    }
    return 0;
}

问题是我正在生成的num参数的排列数组充满了重复...我觉得这可以更有效地完成。

例如,运行PrimeChecker(123)会产生20个条目的排列数组,只需要6个。

有没有人知道如何更有效地做到这一点?

1 个答案:

答案 0 :(得分:2)

我就是这样做的:

var permute = (function () {
    return permute;

    function permute(list) {
        return list.length ?
            list.reduce(permutate, []) :
            [[]];
    }

    function permutate(permutations, item, index, list) {
        return permutations.concat(permute(
            list.slice(0, index).concat(
            list.slice(index + 1)))
            .map(concat, [item]));
    }

    function concat(list) {
        return this.concat(list);
    }
}());

function isPrime(n) {
    for (var i = 2, m = Math.sqrt(n); i <= m; i++)
        if (n % i === 0) return false;
    return true;
}

function PrimeChecker(num) {
    return permute(num.toString(10).split("")).some(function (xs) {
        return isPrime(parseInt(xs.join(""), 10));
    }) ? 1 : 0;
}

alert(PrimeChecker(910));

这是explanation of the algorithm for finding the permutations of the elements of an array

希望有所帮助。