【问题标题】:Is there a way to count duplicated numbers using reduce and iterating once?有没有办法使用reduce和迭代一次来计算重复数字?
【发布时间】:2020-07-03 20:26:20
【问题描述】:

我问自己是否有办法解决计算重复数字的问题,只需迭代一次并使用reduce 方法。

这是我得到的:

const countDuplicate = (numbers) => {
  const occurrencies = {};
  for (var k = 0; k < numbers.length; k++) {
    occurrencies[numbers[k]] = isNaN(occurrencies[numbers[k]])
      ? 1
      : occurrencies[numbers[k]] + 1;
  }
  const counter = Object.values(occurrencies).reduce(
    (total, each) => total + (each > 1 ? 1 : 0),
    0
  );
  return counter;
};

countDuplicate([1,2,3,4]); // returns 0
countDuplicate([1,2,3,4,1,2,2]); // returns 2

【问题讨论】:

  • x.length - (new Set(x)).size
  • 正在迭代numbers一次。你的代码没有问题。 (好吧,你可以在那个循环中处理counter,但它的可读性会降低)
  • 虽然我使用occurrencies 作为辅助数据结构,但我正在迭代numbers 一次

标签: javascript node.js iteration


【解决方案1】:

它绝对可以一次性完成——你的累加器可以是一个对象,在一个属性中存储看到的数字数量,在另一个属性中存储看到的重复数。因此,当满足最小 dup 要求时(数字恰好出现两次),您会增加 dups 数量(该数字的进一步出现将被简单地忽略):

const src = [1,2,3,4,1,2,2],

      {countDups} = src.reduce((r, n) => {
        r.countN[n] = (r.countN[n]||0)+1
        r.countN[n] == 2 && r.countDups++    
        return r
      }, {countN:{}, countDups: 0})
      
console.log(countDups)

【讨论】:

  • 谢谢叶夫根!这是我的预期!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2021-11-15
  • 1970-01-01
相关资源
最近更新 更多