5 problemas comunes de entrevistas de JavaScript: análisis y soluciones

5 problemas comunes de entrevistas de JavaScript: análisis y soluciones

Desde el traductor: publicó un artículo para usted Maria Antonietta Perna, que habla de las tareas típicas de JavaScript, que se ofrece con mayor frecuencia a los solicitantes-desarrolladores en las entrevistas. El artículo será útil, en primer lugar, para los programadores novatos.

Las entrevistas en empresas de tecnología han sido durante mucho tiempo la comidilla de la ciudad. Esto no es sorprendente: la finalización exitosa de la entrevista permite obtener un buen trabajo. Pero esto no es tan fácil, porque a menudo es necesario resolver problemas complejos.

Además, la mayoría de las veces, la mayoría de estas tareas no están relacionadas con el trabajo que realizará el solicitante, pero aún deben resolverse. A veces hay que hacerlo en la pizarra, sin consultar con Google ni con ninguna otra fuente. Sí, la situación está cambiando gradualmente y en algunas empresas rechazan tales entrevistas, pero muchos empleadores aún se adhieren a esta tradición. Este artículo está dedicado al análisis de las tareas típicas de JavaScript que a menudo se usan como tareas para los solicitantes.

Recordamos: para todos los lectores de "Habr": un descuento de 10 rublos al inscribirse en cualquier curso de Skillbox utilizando el código promocional "Habr".

Skillbox recomienda: Curso práctico "Desarrollador móvil PRO".

Lo principal es prepararse cuidadosamente para su entrevista.

Sí, antes de comenzar a desglosar las tareas, veamos algunos consejos generales para prepararse para una entrevista.

Lo principal es prepararse con anticipación. Compruebe qué tan bien recuerda algoritmos y estructuras de datos, y mejore su conocimiento en áreas con las que no está muy familiarizado. Existen muchas plataformas en línea que lo ayudarán a prepararse para las entrevistas. Le recomendamos Geeksparageeks, Cochecito, Entrevistando.io и CódigoSeñal.

Vale la pena aprender a pronunciar la decisión en voz alta. Es recomendable decirle a los solicitantes lo que está haciendo, y no solo escribir en la pizarra (o escribir un código en la computadora, también en silencio). Por lo tanto, si comete un error en el código, pero la solución es generalmente correcta, puede aumentar sus posibilidades de éxito.

El problema necesita ser entendido antes de que la solución pueda ser iniciada. En algunos casos, puede comprender superficialmente la tarea y luego tomar el camino equivocado. Puede valer la pena hacer algunas preguntas aclaratorias al entrevistador.

Debe practicar la escritura de código a mano, no en una PC. Sucede que en las entrevistas al solicitante se le da un marcador y un tablero donde no hay consejos ni formato automático. Cuando busque una solución, escriba su código en una hoja de papel o directamente en la pizarra. Si mantienes todo en tu cabeza, puedes olvidarte de algo importante.

Tareas de plantilla en JavaScript

Probablemente ya esté familiarizado con algunas de estas tareas. Tomaste entrevistas en las que tuviste que resolver algo similar, o practicaste mientras aprendías JavaScript. Bueno, ahora toca resolverlos de nuevo, y con una explicación detallada del proceso.

Palíndromo

Un palíndromo es una palabra, oración o secuencia de caracteres que se lee exactamente de la misma manera tanto en la dirección habitual como en la dirección opuesta. Por ejemplo, "Anna" es un palíndromo, pero "mesa" y "Juan" no lo son.

Puesta en escena

Dada una cadena; necesita escribir una función que le permita devolver verdadero si la cadena es un palíndromo y falso en caso contrario. En este caso, se deben tener en cuenta los espacios y signos de puntuación.

palíndromo('coche de carreras') === verdadero
palíndromo('tabla') === falso

Analizando la tarea

La idea principal aquí es voltear la cuerda hacia atrás. Si la cadena "inversa" es completamente idéntica a la original, entonces tenemos un palíndromo y la función debería devolver verdadero. Si no, falso.

Solución

Aquí está el código que le permite resolver el palíndromo.

const palindrome = str => {
  // turn the string to lowercase
  str = str.toLowerCase()
  // reverse input string and return the result of the
  // comparisong
  return str === str.split('').reverse().join('')
}

El primer paso es convertir los caracteres de cadena de entrada a minúsculas. Esta es una garantía de que el programa comparará exactamente los caracteres en sí, y no el caso o cualquier otra cosa.

El segundo paso es el reverso de la línea. Esto es fácil de hacer: debe convertirlo en una matriz utilizando el método .split() (biblioteca de cadenas). Luego invertimos la matriz usando .reverse() (biblioteca de matrices). El último paso es convertir la matriz inversa en una cadena usando .join() (biblioteca de matrices).

Ahora todo lo que se necesita es comparar la cadena "inversa" con la original, devolviendo el resultado verdadero o falso.

efervescencia

Una de las entrevistas de trabajo más populares.

Puesta en escena

Se requiere escribir una función que muestre números del 1 al n en la consola, donde n es un número entero que la función toma como parámetro, con las siguientes condiciones:

  • efervescencia de salida en lugar de múltiplos de 3;
  • salida de zumbido en lugar de múltiplos de 5;
  • salida fizzbuzz en lugar de múltiplos de 3 y 5.

ejemplo

Efervescencia(5)

resultado

/ / 1
/ / 2
// efervescencia
/ / 4
// zumbido

Analizando la tarea

Lo principal aquí es la forma de encontrar múltiplos usando JavaScript. Se puede implementar usando el operador de módulo o el resto -%, que le permite mostrar el resto al dividir dos números. Si el resto es 0, significa que el primer número es múltiplo del segundo.

12% 5 // 2 -> 12 no es múltiplo de 5
12% 3 // 0 -> 12 es múltiplo de 3

Entonces, si dividimos 12 entre 5, obtenemos 2 con un resto de 2. Si dividimos 12 entre 3, entonces obtenemos 4 con un resto de 0. En el primer caso, 12 no es un múltiplo de 5, en el segundo, 12 es múltiplo de 3.

Solución

La mejor solución sería el siguiente código:

const fizzBuzz = num => {
  for(let i = 1; i <= num; i++) {
    // check if the number is a multiple of 3 and 5
    if(i % 3 === 0 && i % 5 === 0) {
      console.log('fizzbuzz')
    } // check if the number is a multiple of 3
      else if(i % 3 === 0) {
      console.log('fizz')
    } // check if the number is a multiple of 5
      else if(i % 5 === 0) {
      console.log('buzz')
    } else {
      console.log(i)
    }
  }
}

La función realiza las comprobaciones necesarias utilizando declaraciones condicionales y produce el resultado requerido por el usuario. En la tarea, vale la pena prestar atención al orden de las declaraciones if...else: comenzando con una condición doble (&&) y terminando con el caso en que no se pudieron encontrar varios números. Como resultado, cubrimos todas las opciones.

Anagrama

Este es el nombre de una palabra que contiene todas las letras de otra palabra en el mismo número, pero en diferente orden.

Puesta en escena

Necesitamos escribir una función que verifique si dos cadenas son anagramas, y el caso de las letras no importa. Solo cuentan los caracteres; no se tienen en cuenta los espacios ni los signos de puntuación.

anagrama('buscador', 'amigo') --> verdadero
anagrama('hola', 'adiós') --> false

Analizando la tarea

Aquí es importante considerar que es necesario verificar cada letra en dos líneas de entrada y su número en cada línea.

buscador -> f: 1 amigo -> f: 1
yo: 1 r: 1
n: 1 yo: 1
re: 1 mi: 1
mi: 1 norte: 1
r:1 d:1

Para almacenar datos de anagramas, debe elegir una estructura como un objeto literal de JavaScript. La clave en este caso es el carácter de la letra, el valor es el número de repeticiones de la misma en la línea actual.

También hay otras condiciones:

  • Debe asegurarse de que el caso de las letras no se tenga en cuenta al comparar. Simplemente convierta ambas cadenas a minúsculas o mayúsculas.
  • Excluimos todos los que no son personajes de la comparación. Lo mejor para trabajar con expresiones regulares.

Solución

// helper function that builds the
// object to store the data
const buildCharObject = str => {
  const charObj = {}
  for(let char of str.replace(/[^w]/g).toLowerCase()) {
    // if the object has already a key value pair
    // equal to the value being looped over,
    // increase the value by 1, otherwise add
    // the letter being looped over as key and 1 as its value
    charObj[char] = charObj[char] + 1 || 1
  }
  return charObj
}
 
// main function
const anagram = (strA, strB) => {
  // build the object that holds strA data
  const aCharObject = buildCharObject(strA)
  // build the object that holds strB data
  const bCharObject = buildCharObject(strB)
 
  // compare number of keys in the two objects
  // (anagrams must have the same number of letters)
  if(Object.keys(aCharObject).length !== Object.keys(bCharObject).length) {
    return false
  }
  // if both objects have the same number of keys
  // we can be sure that at least both strings
  // have the same number of characters
  // now we can compare the two objects to see if both
  // have the same letters in the same amount
  for(let char in aCharObject) {
    if(aCharObject[char] !== bCharObject[char]) {
      return false
    }
  }
  // if both the above checks succeed,
  // you have an anagram: return true
  return true
}

Presta atención al uso Object.keys () en el fragmento de arriba. Este método devuelve una matriz que contiene los nombres o claves en el mismo orden en que aparecen en el objeto. En este caso, la matriz será así:

['f', 'i', 'n', 'd', 'e', ​​'r']

De esta forma obtenemos las propiedades del objeto sin tener que hacer un gran bucle. En una tarea, puede usar este método con la propiedad .length, para verificar si ambas cadenas tienen la misma cantidad de caracteres; esta es una característica importante de los anagramas.

búsqueda de vocales

Una tarea bastante simple que a menudo aparece en las entrevistas.

Puesta en escena

Debe escribir una función que tome una cadena como argumento y devuelva el número de vocales que contiene la cadena.
Las vocales son "a", "e", "i", "o", "u".

Ejemplo:

buscarVocales('hola') // --> 2
buscarVocales('porque') // --> 0

Solución

Aquí está la opción más fácil:

const findVowels = str => {
  let count = 0
  const vowels = ['a', 'e', 'i', 'o', 'u']
  for(let char of str.toLowerCase()) {
    if(vowels.includes(char)) {
      count++
    }
  }
  return count
}

Es importante prestar atención al uso del método .includes(). Está disponible tanto para cadenas como para matrices. Debe usarse para averiguar si una matriz contiene un cierto valor. Este método devuelve verdadero si la matriz contiene el valor especificado y falso en caso contrario.

También hay una solución más corta al problema:

const findVowels = str => {
  const matched = str.match(/[aeiou]/gi)
  return matched ? matches.length : 0
}

Aquí se usa el método .match(), que le permite implementar una búsqueda eficiente. Si se encuentra una expresión regular como argumento de método dentro de la cadena especificada, el valor de retorno es una matriz de caracteres coincidentes. Bueno, si no hay coincidencias, entonces .match() devuelve nulo.

Fibonacci

Una tarea clásica que se puede cumplir en entrevistas de varios niveles. Vale la pena recordar que la sucesión de Fibonacci es una serie de números, donde cada uno de los siguientes es la suma de los dos anteriores. Entonces, los primeros diez números se ven así: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Puesta en escena

Debe escribir una función que devuelva el registro n en una secuencia determinada, y n es un número que se pasa como argumento a la función.

fibonacci(3) // --> 2

Esta tarea implica recorrer el número de veces especificado en el argumento, devolviendo el valor en la posición adecuada. Esta forma de plantear el problema requiere el uso de bucles. Si usa la recursión en su lugar, al entrevistador le puede gustar y le dará algunos puntos extra.

Solución

const fibonacci = num => {
  // store the Fibonacci sequence you're going
  // to generate inside an array and
  // initialize the array with the first two
  // numbers of the sequence
  const result = [0, 1]
 
  for(let i = 2; i <= num; i++) {
    // push the sum of the two numbers
    // preceding the position of i in the result array
    // at the end of the result array
    const prevNum1 = result[i - 1]
    const prevNum2 = result[i - 2]
    result.push(prevNum1 + prevNum2)
  }
  // return the last value in the result array
  return result[num]
}

En la matriz de resultados, los primeros dos números están contenidos en una fila porque cada entrada en la secuencia consiste en la suma de los dos números anteriores. No hay dos números al principio que se puedan tomar para obtener el siguiente número, por lo que el bucle no puede generarlos automáticamente. Pero, como sabemos, los primeros dos números son siempre 0 y 1. Por lo tanto, puede inicializar la matriz de resultados manualmente.

En cuanto a la recursión, todo es más simple y más complicado al mismo tiempo:

const fibonacci = num => {
  // if num is either 0 or 1 return num
  if(num < 2) {
    return num
  }
  // recursion here
  return fibonacci(num - 1) + fibonacci(num - 2)
}

Seguimos llamando a fibonacci(), pasando números cada vez más pequeños como argumentos. Nos detenemos cuando el argumento pasado es 0 o 1.

conclusión

Lo más probable es que ya te hayas enfrentado a alguna de estas tareas si te entrevistaron para un trabajo como desarrollador de frontend o JavaScript (especialmente si es un nivel junior). Pero si no los encontró, pueden ser útiles en el futuro, al menos para el desarrollo general.

Skillbox recomienda:

Fuente: habr.com

Añadir un comentario