javascript - ¿Cómo puedo devolver solo el número de valores emparejados en la matriz?
(4)
Aquí hay otro enfoque usando un
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
Quiero mostrar el número de valores emparejados en la matriz. Por ejemplo, tengo esta matriz:
[10,10,10,10,20,20,20,30,50]
Me gustaría mostrar
3
porque tenemos 3 pares de números.
¿Cómo puedo hacer esto?
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]))
Me reduciría a un objeto, contando el número de ocurrencias de cada número.
Luego, reduzca nuevamente los
Object.values
del objeto para contar el número de pares, agregando
Math.floor(count / 2)
al acumulador en cada iteración:
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]))
Probablemente sea mejor evitar
.sort
si es posible; eso aumenta la complejidad computacional de
O(n)
(mínimo) a
O(n log n)
.
Muchas gracias a todos los muchachos que me ayudan a entender más sobre cómo resolver este problema. Después de reunir las respuestas en la publicación, llego a mi propia solución.
Gracias a usted, entiendo que debería aumentar i al final de if para evitar una comparación repetitiva.
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
Si entendí bien la pregunta, entonces esto se puede simplificar aún más confiando inicialmente en la clasificación ...
Incremente i a la siguiente posición después de encontrar el par y deje que el bucle for lo incremente una vez más.
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