【问题标题】:Finding every possible "non-duplicate" combination given a set of 6 digits给定一组 6 位数字,找到所有可能的“非重复”组合
【发布时间】:2013-09-10 14:59:35
【问题描述】:

所以我首先被要求创建一个函数来查找可能的组合给定一组 6 个数字,范围可以从 0 到 9 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
        }
    }
}

【问题讨论】:

  • 如果这是您的要求,只需返回所有数字都相同的那些组合。

标签: javascript arrays algorithm math for-loop


【解决方案1】:

您要做的第一件事是对输入进行排序并删除重复的数字。例如,从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>');
        }
    }
}

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

对于上面的示例输入(修改为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

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

【讨论】:

  • 输入(数组 nums )将始终更改。我编辑了帖子
  • 为了解决这个问题,请预处理您的输入。对它们进行排序并删除重复项。对于您的示例输入099384,它将显示为03489。然后您可以使用相同的i&lt;10 支票,以及您在原始支票中的in_array。只需确保以前一个数字而不是 1 开始每个内部循环。
  • 这对我有用..谢谢!编辑问题以显示答案
  • 实际上.. 有前导零的数字呢?还是零?因为我从 1 开始,所以它不起作用。如果我在 for 循环中使其 i=0 会起作用吗?
  • 我更新了一个更简化的版本。如果输入已排序/不同,则根本不需要 in_array(),您可以使用索引而不是 0-9 迭代数组本身。
【解决方案2】:

以下代码将显示 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

【讨论】:

  • 不会输出任何涉及1、2、3的组合
  • 像大多数其他响应一样..这甚至不使用提示输入的 nums 数组..输入可能是 013328 ...不会总是 123456 等..
  • 使用索引从输入数组中读取值!
【解决方案3】:
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
             }

【讨论】:

  • 这是否考虑了输入(数字)?如果输入是 111123,我可能不需要 0-9 之间的每个数字
  • @jwpat7。错字,应该是小写的 i。我想你可以自己在输入数组中添加检查......但我已经编辑添加了
  • 好的,我会试试上面的这个例子
猜你喜欢
  • 1970-01-01
  • 2019-05-24
  • 2011-06-05
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多