代码之家  ›  专栏  ›  技术社区  ›  Diasline

仅返回数组javascript中成对值的数目

  •  3
  • Diasline  · 技术社区  · 5 年前

    我的目的是显示数组中成对值的数目。

    例如,我有这个数组:[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]))
    2 回复  |  直到 5 年前
        1
  •  3
  •   georg    5 年前

    下面是另一种使用 Set :

    function pairNumbers(arr) {
        let count = 0;
        const set = new Set();
    
          for (let i = 0; i < arr.length; i++) {
            if (set.has(arr[i])) {
                count++;
                set.delete(arr[i])
            } else {
                set.add(arr[i])
            }
        }
    
        return count;
    }
    console.log(pairNumbers([10, 10, 10, 10, 20, 20, 20, 30, 50])) // 3
    
        2
  •  7
  •   CertainPerformance    5 年前

    我将减少成一个对象,计算每个数字的出现次数。然后再减少 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) .

        3
  •  1
  •   EugenSunic    5 年前

    如果我很好地理解了这个问题,那么可以通过最初的排序进一步简化…

    找到一对后,将i增加到下一个位置,并让for循环再次增加它。

     function pairNumber(arr) {
        var 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