El ejercicio: El objetivo de este ejercicio es convertir una cadena en una nueva cadena donde cada carácter en la nueva cadena es "(" si ese carácter aparece solo una vez en la cadena original, o ")" si ese carácter aparece más de una vez en la cadena original. Ignore las mayúsculas al determinar si un carácter es un duplicado.
Ejemplos "din" => "((("
"retroceder" => "()()()"
"Éxito" => ")())())"
"((@" => "))(("
Mi código era así:
function duplicateEncode(word) { let str = ""; for (let i = 0; i < word.length; i++) { //This iteration is to examine every character in the string; for (let j = 0; j < word.length; j++) { //This iteration is to compare every character to every other inside the string, in order to check if there is any repetition if (j === i) { //This first conditon was selected because a character is not supposed to be compared to itself continue; } else if (word[i] === word[j]) { str = str + ")"; break; } else if (j !== word.length - 1) { continue; } else if (j === word.length - 1) { str = str + "("; } } } return str; }¿Alguien me puede ayudar a averiguar por qué no funciona para todos los casos?
Por ejemplo:
console.log(duplicateEncode("abc"));Debería devolver ((( en lugar de ((
Pero,
console.log(duplicateEncode("mulherm"));devuelve exactamente lo que se suponía: )((((()
Aparentemente, cada vez que una cadena no tiene un carácter que se repita, la función devuelve una cadena sin el primer elemento. Pero cada vez que la cadena tiene al menos un elemento que se repite, devuelve exactamente lo que se supone que debe hacer.
¿Qué está pasando con mi código?
Creo que el problema es que cuando usa su fragmento a continuación, evita ingresar al último bucle.
if (j === i) { continue; }El problema está presente cada vez que una palabra con una letra no duplicada es la última. es decir
Esto funciona
console.log(duplicateEncode("aba")); //returns )()Esto no lo hace
console.log(duplicateEncode("aab")); //returns ))Lo que podría hacer es agregar una declaración de que cuando
i === word.length - 1 y no hay "(" en su variable str , puede agregar otro ")" a su str.
En otras palabras, si no ha encontrado caracteres duplicados después de verificar la última posición anterior al iterar sobre toda la palabra, se garantiza que la última también será única.
Registros de la consola a continuación
function duplicateEncode(word) { let str = ""; for (let i = 0; i < word.length; i++) { //This iteration is to examine every character in the string; for (let j = 0; j < word.length; j++) { //This iteration is to compare every character to every other inside the string, in order to check if there is any repetition console.log(i); console.log(j); console.log(str); if (j === i) { //This first conditon was selected because a character is not supposed to be compared to itself console.log("continue") continue; } else if (word[i] === word[j]) { console.log("append )") str = str + ")"; break; } else if (j !== word.length - 1) { console.log("j !== length") continue; } else if (j === word.length - 1) { console.log("append (") str = str + "("; } } } return str; }Use un depurador para recorrer su código línea por línea. Hay casos en los que el ciclo interno se completa sin cumplir nunca una de las condiciones para agregar un carácter a la cadena.
En su lugar, use un indicador booleano para indicar si la letra está duplicada, configúrelo dentro del bucle (lógica mucho más simple), luego, después del bucle, haga str += (found ? ')' : '('); . Esto garantiza que agregue exactamente un carácter a la cadena de salida por iteración del ciclo externo.