查找没有重复的数字的所有排列(为清楚起见进行了编辑)

曼宁汉姆

我已经完成了Coderbyte的这项挑战,但是很不明智:

让函数PrimeChecker(num)取num,如果num的任何排列形式是质数,则返回1,否则返回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个条目。

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

阿迪特·玛莎(Aadit m Shah)

这就是我要做的:

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

这是查找数组元素置换的算法说明

希望能有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何创建一个表,其中一列包含具有不同 id 的所有行的相同值?(为清楚起见,请参阅布局)

在XML文件中具有所有参数是否进行了优化?

尽管在TFM中进行了所有尝试,PowerShell Select-String却不匹配

扫描是否在记忆游戏中进行了所有匹配

尽管没有分配,但%CMDCMDLINE%特殊var进行了魔术更改

是否在没有设备密码的情况下对iOS钥匙串进行了加密?

我对Dockerfile进行了更改,但是我的“ docker build”没有反映出更改

获取python中列表的所有排列而没有重复?

查找没有排列的数组的所有可能组合

查找单词中所有非重复字母的排列

进行了错误编辑,如何返回?

为清楚起见,制作新类型/数据是否不好?

有没有一种方法可以检查用户是否对您的应用进行了评分?

有没有办法查询用户对 TFS 票证进行了多少次更改?

有没有办法知道我们在for循环中进行了多少次迭代?

有没有办法找到针对智能屏幕设备进行了优化的操作列表?

生成总数为N的所有数字排列

生成长度为N的所有数字排列

产生数字的所有排列

由于对sched.c进行了一些修改,我是否必须编译所有内核源代码?

Swift:尽管在 for 循环中进行了赋值,但所有类实例的布尔值都保持不变

如果我创建一个原子变量,线程之间是否对原子变量进行了所有操作?

我的 C# 代码对所有 if 语句都进行了彻底检查,尽管它们都是错误的

Geom_point 和 ggboxplot 以及 ggpair 在 ggplot 中错误地对所有绘图点进行了配对

是否在“所有程序”列表中进行了其他安装的Inno安装程序子文件夹?

Findbugs告诉我,没有明显的原因,我将非负值与-1进行了比较

Flask-Login检查是否在没有装饰器的情况下对用户进行了身份验证

是否在运行时对没有变量的C函数调用进行了预编译或评估?

(VSCode Mac)无法开始调试,是的,我已经对其进行了搜索,没有任何帮助