problema de la guerra de códigos
Mi solución a este problema:
function numberOfPairs(gloves) { const glove = gloves.slice().sort(); const pairs = []; for (let i = 0; i < glove.length - 1; i++) { if (glove[i] == glove[i+1]) { pairs.push(glove[i]); } } return pairs.length; }Pasó la prueba inicial pero falló el intento/prueba aleatoria. 2da prueba
Mi segunda solución, agrego i++. Pasa el Intento
function numberOfPairs(gloves) { const glove = gloves.slice().sort(); const pairs = []; for (let i = 0; i < glove.length - 1; i++) { if (glove[i] == glove[i+1]) { pairs.push(glove[i]); i++ // How? } } return pairs.length; }¿Pueden ayudarme? ¿Cómo i ++ soluciona el problema?
También puede agrupar los colores y luego contar los pares usando Array.prototype.reduce .
function solution(input) { return input.reduce( ([pairs, hash], clr) => { hash[clr] = (hash[clr] ?? 0) + 1; return [pairs + (hash[clr] % 2 === 0 ? 1 : 0), hash]; }, [0, {}] )[0]; } console.log(solution(["red", "green", "red", "blue", "blue"])); console.log(solution(["red", "red", "red", "red", "red", "red"]));Porque si encontró un par, el siguiente elemento es igual al real y está avanzando solo un elemento en la matriz a la vez. Si encontró un par, el siguiente elemento fue el que encontró, luego debe avanzar otra posición en la matriz cuando lo encontró.
Digamos que tienes esta matriz: [1, 2, 5, 8, 9, 2, 8] Numeremos las líneas para hacerlo más fácil:
1 function numberOfPairs(gloves) { 2 const glove = gloves.slice().sort(); 3 const pairs = []; 4 for (let i = 0; i < glove.length - 1; i++) { 5 if (glove[i] == glove[i+1]) { 6 pairs.push(glove[i]); 7 i++ // How? 8 } 9 } 10 return pairs.length; 11 }después de la línea 2, tendrá la siguiente matriz ordenada:
[1, 2, 2, 5, 8, 8, 9]con 2 pares en ella. Luego, comenzará la iteración de la matriz con i = 0, por lo que en la línea 6 en la primera iteración, el guante [i] es 1 y el guante [i + 1] es 2. Diferente, por lo que for continúa a i = 1.
Ahora el if en la línea 6 prueba guante[i] con i = 1 haciendo guante[i] = 2 y guante[i+1] también = 2 (primer par). Entonces ingresa el si y empuja el primer número a pares: 2.
Ahora bien, si i++ no está presente en la línea 7, lo que sucedería es que for continuaría con i = 2 haciendo guante[i] = 2 y guante[i + 1] = 5. Pero el 2 forma parte del primer par encontrado . Así que esto es incorrecto. Debemos omitir el segundo 2, para eso está i++, la línea 7 está ahí. Sería aún peor si el cuarto elemento en la matriz fuera 2 nuevamente porque informaría a otro par cuando solo hay uno.
Después de esto, for continuará no a i=2 sino correctamente a i=3 probando los elementos 5 y 8 para el siguiente par.
Espero que esto explique lo suficientemente claro.