javascript - 如何仅返回数组中配对值的数量?




(3)

我想在数组中显示配对值的数量。 例如,我有这个数组:

[10,10,10,10,20,20,20,30,50]

我想显示 3 因为我们有3对数字。 我怎样才能做到这一点?

function pairNumber(arr) {
  var sorted_arr = arr.sort();
  var i;
  var results = [];
  for (i = 0; i < sorted_arr.length; i++) {
    if (sorted_arr[i + 1] == sorted_arr[i]) {
      results.push(sorted_arr[i]);
    }

  }
  return results.length;
}
console.log(pairNumber([10, 10, 10, 10, 20, 20, 20, 30, 50]))


如果我很好地理解了这个问题,那么可以通过最初依赖于sort来进一步简化这个问题。

找到对之后,将i递增到下一个位置,然后让for循环再次将其递增。

 function pairNumber(arr) {
    const sorted_arr = [...arr].sort(); // disallowing array mutation
    let cnt = 0;
    for (let i = 0; i < sorted_arr.length; i++) {
      if (sorted_arr[i + 1] === sorted_arr[i]) {
        cnt++;
        i = i + 1;
      }

    }
    return cnt;
  }
  console.log(pairNumber([10, 10, 10, 10, 10, 20, 20, 20, 20, 30, 30, 50]))
  // 5 --> 2 pairs of 10, 2 pairs of 20, 1 pair of 30
  console.log(pairNumbers([10, 10, 10, 10, 20, 20, 20, 30, 50])) 
  // 3 --> 2 pairs of 10 one pair of 20

我将简化为一个对象,计算每个数字的出现次数。 然后再次减少对象的 Object.values 以计算对数,在每次迭代中将 Math.floor(count / 2) 到累加器:

function pairNumber(arr) {
  const itemCounts = arr.reduce((a, item) => {
    a[item] = (a[item] || 0) + 1;
    return a;
  }, {});
  return Object.values(itemCounts)
    .reduce((pairsSoFar, count) => pairsSoFar + Math.floor(count / 2), 0);
}
console.log(pairNumber([10, 10, 10, 10, 20, 20, 20, 30, 50]))

如果可能的话,最好避免使用 .sort 计算复杂度从 O(n) (最小值)增加到 O(n log n)


非常感谢所有帮助我了解如何解决此问题的人。 在整理完帖子中的答案后,我想出了自己的解决方案。

多亏了您,我知道 如果 不进行重复比较,我应该在结尾处加 i

function pairNumbers(arr) {
const sorted_arr = arr.sort();
const results = [];
for (let i = 0; i < sorted_arr.length; i++) {
if (sorted_arr[i] == sorted_arr[i + 1]) {
results.push(sorted_arr[i]);
i = i + 1; 
}

}
return results.length;
}
console.log(pairNumbers([10, 10, 10, 10, 20, 20, 20, 30, 50])) // 3






javascript