Muy buenas, soy Luis y esta vez les traigo un nuevo post.
Una de las influencias que recuerdo al considerar el desarrollo de software, fue que mi hermana me dijo que sería bueno en eso porque soy «realmente un buen solucionador de problemas». Disfrutamos jugando juegos de ingenio y juegos relacionados con la memoria como «Bomb Corp» de Jackbox Games. Siempre que la impresionaba durante el juego con mi memoria o comprensión de las reglas complicadas, insistía en que podía llevarme bien a la programación. Según su experiencia, el desarrollo de software era «todo solución de problemas». Ahora que soy un desarrollador web full-stack y practico algoritmos en leetcode, puedo entender y apreciar de dónde venía ella. Tienes que involucrar dos habilidades fundamentales para resolver un desafío de codificación. La primera habilidad es la resolución de problemas, por ejemplo, comprender las limitaciones técnicas del problema y cómo trabajar hacia la solución. El segundo es poder convertir esa comprensión en un código ejecutable válido.
Comenzando
Mi primer desafío técnico simulado involucró un algoritmo que realmente resaltaba la habilidad de codificación de «resolución de problemas» como un desafío para la mente. Fue como sigue:
Given any alphabetic string, determine if it is an anagram of a palindrome.
En el momento en que vi esto, pensé que era una pregunta divertida. Para aclarar, un anagrama es una cadena de caracteres que se ha organizado en un nuevo orden, sin eliminar ni agregar caracteres adicionales.
An anagram of "cat" is "tac"
Un palíndromo es una cadena de caracteres que tiene el mismo orden cuando se lee hacia adelante o hacia atrás.
An example of a palindrome is "racecar". It is spelt the same forwards and backwards.
Había practicado problemas para preguntar si dos cadenas son anagramas, donde mi solución consistía en hacer un mapa hash y asegurar que cada carácter existiera en cada cadena la misma cantidad de veces. También había practicado un problema preguntando si una cadena es un anagrama, y mi solución consistía en usar punteros en cada extremo de la cadena, asegurándome de que, a medida que se movían hacia el medio, todos los caracteres coincidieran y si había un número impar de caracteres, el medio podría ser único. Este problema subió la apuesta al combinar los desafíos.
"obb" is an anagram of a palindrome, because "bob" is an anagram of "obb" and "bob" is a palindrome.
Ahora estamos todos en la misma página
Ser capaz de escribir código con fluidez en cualquier idioma es una habilidad inútil a menos que pueda entender cómo resolver el problema. Entonces, sin pensar en software o código, ¿cómo saber si alguna cadena de caracteres podría ser un anagrama de un palíndromo? Podría reorganizar la cadena de caracteres en todas las combinaciones posibles y ver si leen lo mismo hacia adelante y hacia atrás, pero si la cadena contiene más de unos pocos caracteres, eso tomaría absurdamente. Necesitamos pensar de manera más práctica.
Cuando miras la siguiente cadena, ¿qué tan rápido puedes decir que no es un palíndromo?
"that"
Puede ver que «eso» no es un palíndromo de manera bastante instantánea, porque no lee lo mismo hacia adelante y hacia atrás, porque solo hay una «a» y una «h». También puedes decir que «eso» no puede ser un anagrama de un palíndromo, porque pase lo que pase, en una dirección la «a» siempre vendrá antes de la «h» y en la otra dirección siempre vendrá la «h» antes de la «a».
Si pensamos críticamente, podemos inferir algunas reglas de los palíndromos. Para que una cadena se lea lo mismo hacia adelante y hacia atrás, todos los caracteres de un lado de la cadena deben aparecer en el otro lado la misma cantidad de veces. Esto significa que cada personaje debe aparecer un número par de veces. Hay una excepción, si el palíndromo tiene una longitud impar, entonces puede haber un carácter que aparece un número impar de veces y está ubicado en el medio del palíndromo (como la «e» en «coche de carreras»).
Con esta comprensión de las reglas de nuestro problema, podemos idear una solución. Podemos contar las apariciones de cada carácter en nuestra cadena dada, y si más de un carácter aparece una cantidad impar de veces, sabemos que es imposible que la cadena sea un anagrama de un palíndromo.
Resolución de problemas terminado
Ahora que hemos completado la parte de «resolución de problemas» del algoritmo, es hora de utilizar nuestras habilidades de codificación para traducir nuestra solución. El siguiente código es lo que envié como mi solución cuando recibí este mensaje.
function isAnagramOfPalindrome(string){ let numOfChar = {} for(let char of string){ numOfChar[char] ? numOfChar[char]++ : numOfChar[char] = 1 } let containsLessThanOneOdd for(let key in numOfChar){ if(numOfChar[key] % 2 === 1){ if(!containsLessThanOneOdd) containsLessThanOneOdd = true else return false } } return true }
En la solución que escribí, creo un hash, itero a través de la cadena, configuro cada carácter en esa cadena como una clave en mi hash y establezco su valor en 1. Si el carácter aparece nuevamente, incremento ese valor. Una vez que he completado esa tarea, inicializo una variable. Luego, repito mi hash y asigno esa variable a «verdadero» la primera vez que encuentro un valor extraño. Si alguna vez encuentro un segundo valor impar, devuelvo falso y finalizo el proceso. De lo contrario, completo mi iteración y devuelvo verdadero.
No puedo decir que esta sea la mejor solución, pero es una que se me ocurrió y funcionó. Estaba orgulloso de mi capacidad para aislar una condición dentro del problema y utilizarla para desarrollar una solución funcional. Realmente puedo entender por qué mi hermana estaba tan convencida de que el pensamiento crítico, la memoria y las habilidades para resolver problemas pueden indicar la capacidad de alguien para adaptarse bien a la programación. Necesita estas habilidades para descomponer los problemas en su esencia y diseñar soluciones óptimas. Lo más probable es que si le gustan los acertijos y los acertijos, probablemente disfrutará resolviendo algoritmos una vez que aprenda a codificar. Espero que haya encontrado este artículo esclarecedor sobre cómo abordar un desafío de codificación.
¡Gracias por leer!
Añadir comentario