检查数组中的重复项

Posted

技术标签:

【中文标题】检查数组中的重复项【英文标题】:Checking for duplicates within an array 【发布时间】:2021-12-31 18:15:09 【问题描述】:

我正在尝试检查更大数组中匹配的数组实例。为此,我正在实现一个条件,如果数组中三个数字中的两个与更大数组中任何数组的三个成员中的两个匹配,则有一个 continue 语句返回到上一个循环:

var threeSum = function (nums) 
  let result = [];
  for (let i = 0; i < nums.length - 2; i++) 
    for (let j = i + 1; j < nums.length - 1; j++) 
      loop1: for (let k = j + 1; k < nums.length; k++) 
        if (nums[i] + nums[j] + nums[k] === 0) 
          let smallArray = [nums[i], nums[j], nums[k]].sort((a, b) => a - b);
          for (let l = 0; l < smallArray.length && result[l]; l++) 
            if (
              smallArray[0] == result[l][0] &&
              smallArray[1] == result[l][2]
            ) 
              console.log("we already have this array")
              continue loop1;
            
          
          result.push(smallArray);
        
      
    
  
  return result;
;

因此,对于 example threeSum([-1, 0, 1, 2, -1, -4]) 应该返回 [[-1, 0, 1], [-1, -1, 2]] 而不是返回 [[-1, 0, 1], [-1, -1, 2], [-1, 0, 1]]。我已经在最里面的条件中使用了 console.log 进行了检查,并且 if 语句永远不会返回为真,所以它永远不会进入 continue 命令。但是第一个数组和第三个数组应该满足这个要求,所以在检查第三个数组时,函数似乎应该回退命令。

我有点不明白出了什么问题。

【问题讨论】:

为什么三个数组的结果是错误的?你想获得独特的价值吗? @NinaScholz,是的,目的是获得独特的价值 【参考方案1】:

单循环方法,但对具有相同值的数组进行递归和过滤。

function threeSum(array, temp = [], sum = 0, i = 0) 
    if (temp.length === 3) return sum ? [] : [temp];

    const result = [];
    
    while (i < array.length) 
        result.push(...threeSum(array, [...temp, array[i]], sum + array[i], ++i));
    

    return result.filter((s => a => (b => !s.has(b) && s.add(b))([...a].sort().join('|')))(new Set));


console.log(threeSum([-1, 0, 1, 2, -1, -4]));

【讨论】:

以上是关于检查数组中的重复项的主要内容,如果未能解决你的问题,请参考以下文章

删除数组中的重复项

使用 C# 在复杂的 JSON 数组中查找和打印重复项

php:检查数组是不是有重复项

Flash as3 如何删除数组中的重复项?

Ios Swift:删除图像数组中的重复项

使用 Perl 检查数据数组中重复项的最有效方法是啥?