检查数组的每个元素是否在多个数组中。

3

我很难找到解决这个问题的方法。

假设有6个颜色数组,每个数组有1-3个颜色,并且颜色可以重复:

['white', 'blue']
['green', 'yellow']
['black']
['yellow', 'blue', 'pink']
['orange', 'red']
['brown', 'white']

用户输入了6种颜色,例如:白色、蓝色、粉色、黑色、橙色、黄色。如何检查这些颜色都是数组的一部分,并且所有颜色都可以选择,假设每个数组只能选择一个。
我希望我的问题清晰易懂。
编辑:重新表述问题
有6个颜色数组,如上所示,用户必须从每个数组中选择1个。如何检查用户的输入是否正确,假设他提交的顺序不是数组的顺序。

有什么想法吗?只需要两个嵌套循环和一个 if 语句吗? - zerkms
2
这是一份作业?听起来像一份作业。 - Posthuma
问题在于颜色重复,每个数组只能选择一个。不是作业任务,而是为了一个在线游戏,我只是用颜色来简化问题。 - The Immortal
每个输入的颜色必须来自不同的数组。如何检查这一点是问题所在。 - The Immortal
所以问题是要检查是否存在一组颜色数组,使得它们中的每一个与输入的交集恰好有一个元素? - freakish
显示剩余4条评论
1个回答

2
这似乎需要使用递归来解决(虽然不是最高效的解决方案,但肯定是最简单的解决方案,如果您的数据很小,这应该没有关系):
var check = function(input, colors) {
    if (!input.length) {
        return true;
    }
    var input_color = input.pop();
    var ok = false;
    for (var i = 0; i < colors.length; i++) {
        var color = colors[i];
        if (!color) {
            break;
        }
        if (color.indexOf(input_color) !== -1) {
            colors.splice(i, 1);
            ok = check(input, colors);
            if (!ok) {
                colors.splice(i, 0, color);
            } else {
                break;
            }
        }
    }
    if (!ok) {
        input.push(input_color);
    }
    return ok;
};

并且使用方法:

var colors = [
  ['white', 'blue'],
  ['green', 'yellow'],
  ['black'],
  ['yellow', 'blue', 'pink'],
  ['orange', 'red'],
  ['brown', 'white']
];
check(['white', 'blue', 'pink', 'black', 'orange', 'yellow'], colors);

请注意,它会改变colorsinputs数组(每次调用check时都必须复制它们)。
实际上,这个问题与路径查找问题非常相似。这是一种暴力解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接