javascript - Wie kann ich nur die Anzahl der gepaarten Werte im Array zurückgeben?




(3)

Ich möchte die Anzahl der gepaarten Werte im Array anzeigen. Zum Beispiel habe ich dieses Array:

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

Ich möchte 3 anzeigen, weil wir 3 Zahlenpaare haben. Wie kann ich das machen?

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]))


Hier ist ein anderer Ansatz mit einem 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


Ich würde in ein Objekt reduzieren und die Anzahl der Vorkommen jeder Zahl hochzählen. Reduzieren Sie dann erneut die Object.values des Objekts, um die Anzahl der Paare zu zählen, und Math.floor(count / 2) dem Akkumulator bei jeder Iteration 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]))

Vermutlich ist es besser, .sort zu vermeiden, wenn dies möglich ist - dies erhöht den Rechenaufwand von O(n) (Minimum) auf O(n log n) .


Wenn ich die Frage gut verstanden habe, kann dies noch weiter vereinfacht werden, indem ich mich anfangs auf sortiere ...

Inkrementieren Sie i zur nächsten Position, nachdem Sie das Paar gefunden haben, und lassen Sie die for-Schleife erneut inkrementieren.

 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






javascript