在给定一组6位数的情况下查找每个可能的“非重复”组合

时间:2013-09-10 14:59:35

标签: javascript arrays algorithm math for-loop

所以我第一次被要求创建一个函数来找到可能的组合给定一组6个数字,范围从0到9 编辑请记住,用户会收到提示输入,所以输入可以改变或不同..所以换句话说,输入将是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
        }
    }
}

3 个答案:

答案 0 :(得分:2)

您要做的第一件事是对输入进行排序并删除重复的数字。例如,从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循环运行,每个“块”是外部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

奖励:您可以通过这种方式找到的数字组合始终为nums中{{1}}的不同数字位数。

答案 1 :(得分:0)

以下代码将显示4,5,6的组合。您可以更改以包含有价值的内容

for (var i = 4; i < 7; i++)
    for(var y = i; y < 7 ; y++)
        for(var z = y ; z < 7; z++)
            $('#result').append('<div>' + i + '' + y + '' + z + '</div>');

这就是你想要的。 JSFIDDLE

答案 2 :(得分:0)

function findthree(nums) {
for (var i=0; in_array(i, nums); i++)
  if(in_array(i, nums))  
    for (var j=i; in_array(j, nums); j++) 
       if(in_array(j, nums) 
          for (var k=j; in_array(k, nums); k++)
             if(in_array(k, nums) {
               // other stuff
             }

如果您不希望结果包含多次具有相同位数的三元组(112,133等),则将初始值更改为不添加+1 ...

function findthree(nums) {
for (var i=0; in_array(i, nums); i++)
  if(in_array(i, nums))  
    for (var j=i+1; in_array(j, nums); j++) 
       if(in_array(j, nums) 
          for (var k=j+1; in_array(k, nums); k++)
             if(in_array(k, nums) {
               // other stuff
             }