使用说明

Given an array, print out all of the duplicates within that array.

let arr = [1, 2, 2, 3, 3, 4, 5, 5, 8, 8, 9, 10];

const result = arr.filter(x => arr.filter(y => y === x).length > 1);

console.log(result);

// 2, 2, 3, 3, 5, 5, 8, 8


因此,其他人请提供这个答案,据我所知,但我正在寻找使用for循环的替代解决方案。

我想出了这个,但这只会返回

2, 3, 5, 8而不是我需要的上述结果。

const result2 = () => {
  let newArray = [];

  for(let i = 0; i < arr.length; i++) {
    if(arr[i] === arr[i + 1]) {
      newArray.push(arr[i])
    }
  }
   return newArray
}

console.log(result2(arr));

// 2, 3, 5, 8


我想念什么?我需要它打印出所有重复项,而不仅仅是告诉我哪些重复项。

最佳答案

您当前的

if(arr[i] === arr[i + 1]) {


不会检查前一个元素是否相同(并且即使更改为|| arr[i] === arr[i - 1],也仅适用于已排序的数组,尚未声明可以保证)。



let arr = [1, 2, 2, 3, 3, 4, 5, 5, 8, 8, 9, 10];
const result2 = () => {
  let newArray = [];

  for (let i = 0; i < arr.length; i++) {
    if (arr[i] === arr[i + 1] || arr[i] == arr[i - 1]) {
      newArray.push(arr[i]);
    }
  }
  return newArray;
}

console.log(result2(arr));





要模拟现有的嵌套.filter,您需要找出数组中有多少个匹配元素-再次遍历数组并检查有多少个匹配项:



let arr = [1, 2, 2, 3, 3, 4, 5, 5, 8, 8, 9, 10];
const result2 = () => {
  let newArray = [];

  for (let i = 0; i < arr.length; i++) {
    let count = 0;
    for (let j = 0; j < arr.length; j++) {
      if (arr[i] === arr[j]) {
        count++;
      }
    }
    if (count >= 2) {
      newArray.push(arr[i])
    }
  }
  return newArray
}

console.log(result2(arr));





但这具有很差的计算复杂度(O(N^2))。我希望计算出每个元素提前出现的次数(O(N)):



let arr = [1, 2, 2, 3, 3, 4, 5, 5, 8, 8, 9, 10];
const result2 = () => {
  const countsByNum = arr.reduce((a, num) => {
    a[num] = (a[num] || 0) + 1;
    return a;
  }, {});
  let newArray = [];

  for (let i = 0; i < arr.length; i++) {
    if (countsByNum[arr[i]] >= 2) {
      newArray.push(arr[i]);
    }
  }
  return newArray
}

console.log(result2(arr));

09-25 18:11
查看更多