下面是我针对 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/