La tarea es escribir una función que encuentre una cantidad de elementos que aparecen más de una vez en una matriz.
Por ejemplo:
countIdentic([3, 3, 7, 7, 3, 3, 4, 5, 5, 8, 8, 8]) devuelve 4
countIdentic([15,14,13,19,13,14,14,14,7,9,9]) devuelve 3
Ya tengo una solución pero me resulta complicado. Entonces, ¿quizás haya una solución más elegante para esa tarea?
function countIdentic(arr) { var clone = arr.slice(0), test = [], cur, count = 0; while (clone.length) { cur = clone.shift(); if (test.indexOf(cur) === -1) { test.push(cur); if (clone.indexOf(cur) >= 0) { count++; } } } return count; } console.log( countIdentic([3, 3, 7, 7, 3, 3, 4, 5, 5, 8, 8, 8]) ); console.log( countIdentic([15,14,13,19,13,14,14,14,7,9,9]) );Puede usar Set , por lo que no itera muchas veces sobre la matriz original. Pero eso requerirá algo más de complejidad espacial :)
Complejidad del espacio: O(n) , donde n es arr.length . Dado que seenOnce y duplicates pueden crecer hasta el tamaño arr.length .
Complejidad de tiempo: O(n) , donde n es arr.length . Dado que iteramos sobre el arr solo una vez.
function countIdentic(arr) { const seenOnce = new Set(); const duplicates = new Set(); arr.forEach((item) => { if (duplicates.has(item)) { return; } if (seenOnce.has(item)) { duplicates.add(item); seenOnce.delete(item); return; } seenOnce.add(item); }); return duplicates.size; } console.log(countIdentic([3, 3, 7, 7, 3, 3, 4, 5, 5, 8, 8, 8])); console.log(countIdentic([15, 14, 13, 19, 13, 14, 14, 14, 7, 9, 9])); function countIdentic(arr) { return [... // get number of occurences for every item arr.reduce((map, num) => map.set(num, (map.get(num) ?? 0) + 1), new Map) .entries() ] // filter pairs with more than one occurence .filter(([num, count]) => count > 1) // get the count .length; } console.log( countIdentic([3, 3, 7, 7, 3, 3, 4, 5, 5, 8, 8, 8]) ); console.log( countIdentic([15,14,13,19,13,14,14,14,7,9,9]) );