Javascript - 求对称差 - For 循环错误

标签 javascript arrays for-loop

下面是我针对 FreeCodeCamp 的“Symmetric Difference”挑战的解决方案。

正确的代码应返回2, 3, 4, 6, 7。为什么我的代码返回 2, 3, 4, 6

 function sym(args) {
    args = Array.from(arguments);
    var newArr = [];

    function removeFirstIndex() {
        for (var i = 0; i <= args[1].length; i++) {
            if (args[1].indexOf(args[0][i]) === -1) {
                newArr.push(args[0][i]);
            }
            if (args[0].indexOf(args[1][i]) === -1) {
                newArr.push(args[1][i]);
            }
        }
        args = args.splice(2);
        args.unshift(newArr);
        newArr=[];
    }
    while (args.length>1){
        removeFirstIndex();
    }
    args=args.reduce(function(a,b){
        return a.concat(b);
    });
    args=args.filter(function(elem,pos,self){
        return self.indexOf(elem)===pos && elem!==undefined;
    });
    return args.sort();
}
sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3]); // should return 2, 3, 4, 6, 7

最佳答案

您的内部 for 循环运行 i 到两个数组之一的长度,但您使用该索引来寻址两个数组中的元素。如果它们的长度不同,您将跳过元素,或检查超出较短数组长度的值。

因此您需要将该循环拆分为两个单独的循环:

    for (var i = 0; i <= args[0].length; i++) {
        if (args[1].indexOf(args[0][i]) === -1) {
            newArr.push(args[0][i]);
        }
    }
    for (var i = 0; i <= args[1].length; i++) {
        if (args[0].indexOf(args[1][i]) === -1) {
            newArr.push(args[1][i]);
        }
    }

这解决了您的问题。

现在,您可以通过使用散列来改进这一点,您可以使用 Set 来实现这一点。

带有集合的解决方案:

这里是执行哈希运算的 ES6 代码。这避免了 indexOf 操作(其时间复杂度为 O(n)),并使用 Set.prototype.has 代替(O(n))在大多数实现中>O(1)):

function sym(...args) {
  return Array.from(
    args.map( a => new Set(a) )
      .reduce( (a, b) => new Set([...a, ...b].filter( x => !a.has(x) || !b.has(x) )) )
    ).sort();
}
var result = sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3]); 
// should return 2, 3, 4, 6, 7

console.log(result);

关于Javascript - 求对称差 - For 循环错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40185262/

相关文章:

javascript - 处理 JavaScript 对象中缺失属性的最佳实践?

arrays - F#查找2个数组/列表之间的丢失元素

ios - 如何在 Objective C 中添加两个不同大小的数组?

python - For 循环的迭代次数比我在 Python 中预期的要少

java - 为什么 arrayList 中存储的每个对象的内容具有相同的值?

swift - 跳转到 swift - json 字典数组的问题

javascript - 将 div 链接到其中的 href

javascript - 使用正则表达式删除所有 HTML <button> 元素

javascript - 如何在 html5 和 javascript 中编辑像素并删除 Canvas 图像中的白色背景

javascript : Merge 2 arrays with property and index