freeCodeCamp/guide/spanish/certifications/javascript-algorithms-and-d.../javascript-algorithms-and-d.../palindrome-checker/index.md

9.6 KiB

title localeTitle
Palindrome Checker Comprobador de palíndromo

:triangular_flag_on_post: Recuerda usar Read-Search-Ask si te atascas. Tratar de emparejar el programa :busts_in_silhouette: y escribe tu propio código :pencil:

:checkered_flag: Explicación del problema:

Nuestro objetivo para resolver este problema es ordenar la cadena que se pasa y comprobar si es en realidad un palíndromo.

  • Si no está seguro de qué es un palíndromo, es una palabra o frase que cuando se invierte deletrea la misma cosa hacia adelante o hacia atrás. Un ejemplo simple es mom , cuando inviertes las letras, ¡deletrea lo mismo! Otro ejemplo de un palíndromo es el race car . Cuando eliminamos cualquier cosa que no sea un personaje, se convierte en un racecar que se escribe igual hacia adelante o hacia atrás.

Una vez que hayamos determinado si se trata de un palíndromo o no, queremos devolver true o false según nuestros hallazgos.

Enlaces relevantes

:speech_balloon: Sugerencia: 1

Las expresiones regulares, RegEx , se pueden usar para eliminar caracteres no deseados de la cadena.

intenta resolver el problema ahora

:speech_balloon: Sugerencia: 2

Los métodos Array.prototype.split y Array.prototype.join pueden ser de utilidad aquí. For y while bucles son otra alternativa, ¡o por qué ni siquiera map !

intenta resolver el problema ahora

:speech_balloon: Sugerencia: 3

String.prototype.toLowerCase se puede usar para hacer una cadena en minúscula.

intenta resolver el problema ahora

¡Alerta de spoiler!

señal de advertencia

¡Solución por delante!

:beginner: Solución de código básico:

    function palindrome(str) { 
      return str.replace(/[\W_]/g, '').toLowerCase() === 
             str.replace(/[\W_]/g, '').toLowerCase().split('').reverse().join(''); 
    } 

:rocket: Ejecutar código

Explicación del código:

  • Comenzamos utilizando expresiones regulares para reemplazar cualquier espacio en blanco o caracteres no alfanuméricos con nada (o null ), que esencialmente los elimina de la cadena.

  • A continuación encadenamos .toLowerCase() para eliminar las letras en mayúscula porque A es un personaje diferente a a . El problema no nos pidió que nos preocupáramos por asegurarnos de que el caso de los personajes fuera idéntico, solo la ortografía.

  • Nuestro siguiente paso es tomar nuestra cadena y .split() it, .reverse() y, finalmente, .join() nuevo.

  • ¡El último paso es verificar que la cadena sea la misma hacia adelante y hacia atrás y devolver nuestro resultado!

Enlaces relevantes

:sunflower: Solución de código intermedio:

    function palindrome(str) { 
      str = str.toLowerCase().replace(/[\W_]/g, ''); 
      for(var i = 0, len = str.length - 1; i < len/2; i++) { 
        if(str[i] !== str[len-i]) { 
          return false; 
        } 
      } 
      return true; 
    } 

:rocket: Ejecutar código

Explicación del código:

  • Comenzamos usando los mismos métodos para reemplazar los caracteres que no queremos en la cadena usando expresiones regulares de RegEx , y luego hacemos nuestra cadena en minúscula.

  • A continuación, configuramos nuestro bucle for y declaramos un índice i para realizar un seguimiento del bucle. Establecemos nuestra secuencia de escape en cuando i es mayor que la longitud de la cadena dividida por dos, lo que le dice al bucle que se detenga después del punto medio de la cadena. Y finalmente configuramos i para incrementar después de cada bucle.

  • Dentro de cada bucle queremos comprobar que la letra en el elemento [i] es igual a la letra en la longitud de la cadena menos i, [str.length - i] . En cada bucle, el elemento que se comprueba en ambos lados de la cadena se mueve más cerca del centro hasta que hayamos verificado todas las letras. Si en algún punto las letras no coinciden, devolvemos false . Si el bucle se completa con éxito, significa que tenemos un palíndromo y, por lo tanto, devolvemos true .

Enlaces relevantes

  • Regex

:rotating_light: Solución de código avanzada (más ejecutante):

    //this solution performs at minimum 7x better, at maximum infinitely better. 
    //read the explanation for the reason why. I just failed this in an interview. 
    function palindrome(str) { 
      //assign a front and a back pointer 
      let front = 0 
      let back = str.length - 1 
 
      //back and front pointers won't always meet in the middle, so use (back > front) 
      while (back > front) { 
        //increments front pointer if current character doesn't meet criteria 
        if ( str[front].match(/[\W_]/) ) { 
          front++ 
          continue 
        } 
        //decrements back pointer if current character doesn't meet criteria 
        if ( str[back].match(/[\W_]/) ) { 
          back-- 
          continue 
        } 
        //finally does the comparison on the current character 
        if ( str[front].toLowerCase() !== str[back].toLowerCase() ) return false 
        front++ 
        back-- 
      } 
 
      //if the whole string has been compared without returning false, it's a palindrome! 
      return true 
 
    } 

:rocket: Ejecutar código

Explicación del código:

  • Me dieron este problema en una entrevista (spoiler: no fui contratado :frowning: ) Rápidamente llegué a la solución básica, y el entrevistador me dijo que la mejorara. El algoritmo tomaría demasiado tiempo si pasara la Biblia como la cadena. Quería que fuera instantáneo.

  • Las soluciones más simples funcionan muy mal en cadenas largas porque operan en toda la cadena varias veces (toLowerCase (), replace (), split (), reverse (), join ()) antes de comparar la cadena completa dos veces.

  • La belleza de esta solución es que nunca necesita leer toda la cadena, ni una sola vez, para saber que no es un palíndromo. ¿Por qué leer toda la cadena si puedes decir que no es un palíndromo con solo mirar dos letras?

  • Utiliza un bucle while en lugar de un bucle for como una mejor práctica, ya que estamos usando dos variables, una es el índice que comienza desde el principio de la cadena y la otra comienza al final de la cadena.

Enlaces relevantes

:clipboard: NOTAS PARA LAS CONTRIBUCIONES:

  • :warning: NO agregue soluciones que sean similares a las soluciones existentes. Si cree que es similar pero mejor , intente fusionar (o reemplazar) la solución similar existente.
  • Agregue una explicación de su solución.
  • Categorice la solución en una de las siguientes categorías: Básica , Intermedia y Avanzada . :traffic_light:
  • Agregue su nombre de usuario solo si ha agregado algún contenido principal relevante . ( :warning: NO elimine ningún nombre de usuario existente )

Ver :point_right: Wiki Challenge Solution Template para referencia.