javascript - 给定一组 6 位数字,找出所有可能的 "non-duplicate"组合

标签 javascript arrays algorithm math for-loop

所以我首先被要求创建一个函数来找到给定范围为 0-9 的一组 6 个数字的可能组合 EDIT 请记住,系统会提示用户输入输入所以输入可以改变或不同..所以换句话说,输入将是 123456 或 099384 END EDIT。此函数必须返回 3 位数结果的所有可能组合,同时使用输入的 6 位数重复次数。因此它会返回 111 112 113 等。

.我是 php/javascript 用户并选择了 javascript,以便它可以在浏览器中的离线文件上运行。

这是我在下面构建的,效果很好。

function findthree(nums) {
    for (var i = 0; i < 10; i++) {
        if (in_array(i, nums)) {
            for (var ii = 0; ii < 10; ii++) {
                if (in_array(ii, nums)) {
                    for (var iii = 0; iii < 10; iii++) {
                        if (in_array(iii, nums)) {
                            $('body').append('<div>' + i + '' + ii + '' + iii + '</div>');
                        }
                    }
                }
            }
        }
    }

}


function in_array(needle, haystack) {
    var length = haystack.length;
    for (var i = 0; i < length; i++) {
        if (haystack[i] == needle) return true;
    }
    return false;
}

我的问题是.. 我将如何创建一个类似的函数来显示除了“组合重复项”之外的每个组合。换句话说,该函数不会返回 211,因为 112 已经返回,而 654 不会返回,因为 456 已经返回。我打算尝试使用 array_difference 函数,但无法完全弄清楚它是如何工作的。

提前感谢您的帮助。

在我选择的答案的帮助下找到的编辑答案

function findthreenodupe(nums) {
    nums = $.distinct(nums);
    nums.sort(function(a, b) {
        return a - b
    });
    alert(nums);
    for (var i = 1; i < 10; i++) {
        if (in_array(i, nums)) {
            for (var ii = i; ii < 10; ii++) {
                if (in_array(ii, nums)) {
                    for (var iii = ii; iii < 10; iii++) {
                        if (in_array(iii, nums)) {
                            $('body').append('<div>' + i + '' + ii + '' + iii + '</div>');
                        }
                    } // end of iii for loop
                } // end of ii for loop
            } // end of i for loop
        }
    }
}

最佳答案

您要做的第一件事是对输入进行排序并删除重复的数字。例如,从 099384 得到 03489

然后,您甚至不必检查 0-9 中的所有数字,您可以直接使用数组索引。这将消除一些工作,并且您可以摆脱丑陋的 if(in_array(i, nums)) 括号。这样的事情应该有效:

for(var i=0; i<nums.length; i++){
    for(var ii=i; ii< nums.length; ii++){
        for(var iii=ii; iii<nums.length; iii++){
            $('body').append('<div>' + nums[i] + '' + nums[ii] + '' + nums[iii] + '</div>');
        }
    }
}

关键区别不是每次都从第一个索引开始,而是从前一个数字开始。这确保每个数字都 >= 到它之前的那个(因为它是排序的),它最终类似于握手问题。

对于上面的示例输入(修改为 03489),您可以在下面想象它在做什么。 iii 循环的每次运行都是一个数字。每行都是 ii 循环运行,每个“ block ”都是外部 i 循环的运行。

000 003 004 008 009
033 034 038 039
044 048 049
088 089
099

333 334 338 339
344 348 349
388 389
399

444 448 449
488 489
499

888 889
899

999

奖励:您将通过这种方式找到的数量 组合始终是 tetrahedral number nums 中不同数字的数量。

关于javascript - 给定一组 6 位数字,找出所有可能的 "non-duplicate"组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18722351/

相关文章:

javascript - 弹出窗口中的弹出窗口,第二个弹出窗口没有焦点?

algorithm - 在Matlab中转换矩阵的相邻元素

algorithm - 使用快速傅立叶变换的多项式乘法

arrays - 如何找到每行中非零元素的位置?

c - C 中按列的多维操作

javascript - 如何强制 Firebase 实时数据库使用 WebSockets?

javascript - node.js console.log 抛出我未定义

javascript - 错误 : Cannot read property fetch. 将 jest-expo 与 React Native 一起使用

c - 使用一组元素初始化数组

javascript - 根据对象的 Angular 下拉数组显示内容