javascript

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