
Del traductor: hemos publicado un artículo para usted , que con más frecuencia se ofrecen a los solicitantes de empleo en entrevistas. El artículo será útil, especialmente para los programadores principiantes.
Las entrevistas en empresas tecnológicas se han convertido en una leyenda urbana. No es sorprendente, ya que pasar con éxito una entrevista brinda la oportunidad de obtener un buen empleo. Pero no es tan sencillo, ya que a menudo hay que resolver problemas complejos.
Además, la mayoría de estos problemas no están relacionados con el trabajo que el solicitante realizará, pero aún así deben resolverse. A veces, hay que hacerlo en una pizarra, sin consultar Google o cualquier otra fuente. Sí, la situación está cambiando gradualmente y en algunas empresas están abandonando estas entrevistas, pero muchos empleadores aún mantienen esa tradición. Este artículo está dedicado al análisis de las tareas típicas de JavaScript que se utilizan a menudo como ejercicios para candidatos.
Recordamos: para todos los lectores de «Habr» — un descuento de 10,000 rublos al registrarse en cualquier curso de Skillbox usando el código promocional «Habr».
Skillbox recomienda: Curso práctico .
Lo principal es prepararse meticulosamente para su entrevista
Sí, antes de comenzar a desglosar las tareas, veamos algunos consejos generales para prepararse para la entrevista.
Lo principal es prepararse con anticipación. Verifique cuánto bien recuerda los algoritmos y estructuras de datos y refuerce su conocimiento en las áreas que no le son tan familiares. Hay muchas plataformas en línea que pueden ayudarle a prepararse para las entrevistas. Recomendamos , , y .
Es útil aprender a verbalizar la solución en voz alta. Es recomendable contar a los entrevistadores lo que está haciendo, en lugar de solo escribir en la pizarra (o teclear en la computadora, también en silencio). De esta manera, si comete un error en el código, pero su enfoque de solución es esencialmente correcto, puede aumentar sus posibilidades de éxito.
Es necesario reflexionar sobre la tarea antes de comenzar a resolverla. En algunos casos, puede entender superficialmente la tarea y luego optar por un camino incorrecto. Puede ser útil hacer algunas preguntas aclaratorias al entrevistador.
Es necesario practicar escribir código a mano, en lugar de en una PC. A veces, en las entrevistas, se le da al candidato un marcador y una pizarra sin pistas ni formato automático. Al buscar una solución, es recomendable escribir su código en un papel o directamente en la pizarra. Si se intenta mantener todo en la cabeza, se puede olvidar algo importante.
Tareas de ejemplo en JavaScript
Probablemente algunas de estas tareas ya te son conocidas. O bien has participado en entrevistas donde era necesario resolver algo similar, o has practicado en ellas mientras aprendías JavaScript. Ahora es el momento de resolverlas nuevamente, esta vez con una explicación detallada del proceso.
Palíndromo
Un palíndromo es una palabra, frase o secuencia de caracteres que se lee exactamente igual de izquierda a derecha que de derecha a izquierda. Por ejemplo, "Anna" es un palíndromo, mientras que "table" y "John" no lo son.
Enunciado
Se da una cadena; se necesita escribir una función que devuelva true si la cadena es un palíndromo y false si no lo es. Además, se deben considerar los espacios y los signos de puntuación.
palindrome('racecar') === true
palindrome('table') === false
Analizando la tarea
La idea principal aquí es invertir la cadena en sentido inverso. Si la cadena "invertida" es idéntica a la original, significa que hemos encontrado un palíndromo y la función debe devolver true. Si no, debe devolver false.
Solución
Aquí está el código que permite resolver el palíndromo.
const palindrome = str => {
// convierte la cadena a minúsculas
str = str.toLowerCase()
// invierte la cadena de entrada y devuelve el resultado de la
// comparación
return str === str.split('').reverse().join('')
}El primer paso es convertir los caracteres de la cadena de entrada a minúsculas. Esto garantiza que el programa compare los propios caracteres, no el caso u otras cosas.
El segundo paso es invertir la cadena. Esto no es difícil: es necesario convertirla en un array utilizando el método .split() (biblioteca String). Luego, invertimos el array usando .reverse() (biblioteca Array). El último paso es convertir el array invertido de nuevo en una cadena usando .join() (biblioteca Array).
Ahora, lo único que queda es comparar la cadena "invertida" con la original, devolviendo el resultado true o false.
FizzBuzz
Uno de los problemas más populares en las entrevistas.
Enunciado
Se requiere escribir una función que imprima en la consola los números del 1 a n, donde n es un número entero que la función recibe como parámetro, con las siguientes condiciones:
- imprimir fizz en lugar de los números que son múltiplos de 3;
- mostrar buzz en lugar de números múltiplos de 5;
- mostrar fizzbuzz en lugar de números que son múltiplos de 3 y 5.
Ejemplo
Fizzbuzz(5)
Resultado
// 1
// 2
// fizz
// 4
// buzz
Analizando la tarea
Lo principal aquí es la forma de buscar números múltiplos usando JavaScript. Se puede implementar usando el operador módulo o residuo — %, que muestra 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 residuo de 2. Si dividimos 12 entre 3, obtenemos 4 con un residuo de 0. En el primer caso, 12 no es múltiplo de 5, en el segundo — 12 es múltiplo de 3.
Solución
La solución óptima será el siguiente código:
const fizzBuzz = num => {
for(let i = 1; i <= num; i++) {
// verificar si el número es múltiplo de 3 y 5
if(i % 3 === 0 && i % 5 === 0) {
console.log('fizzbuzz')
} // verificar si el número es múltiplo de 3
else if(i % 3 === 0) {
console.log('fizz')
} // verificar si el número es múltiplo de 5
else if(i % 5 === 0) {
console.log('buzz')
} else {
console.log(i)
}
}
}La función realiza las comprobaciones necesarias usando operadores condicionales y entrega el resultado que el usuario necesita. En la tarea se debe prestar atención al orden de los operadores if…else: comenzando con la condición doble (&&) y finalizando con el caso en que no se encontraron números múltiplos. Como resultado, cubrimos todas las posibilidades.
Anagrama
Así se llama a una palabra que contiene todas las letras de otra palabra en la misma cantidad, pero en un orden diferente.
Enunciado
Es necesario escribir una función que verifique si dos cadenas son anagramas, sin que importe el caso de las letras. Solo se consideran los caracteres; se ignoran los espacios o signos de puntuación.
anagram('finder', 'Friend') -> true
anagram('hello', 'bye') -> false
Analizando la tarea
Aquí es importante tener en cuenta que es necesario verificar cada letra en ambas cadenas de entrada y su cantidad en cada cadena.
finder -> f: 1 friend -> f: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r: 1 d: 1
Para almacenar los datos del anagrama, se debe elegir una estructura como un literal de objeto en JavaScript. La clave en este caso es el símbolo de la letra, el valor es la cantidad de veces que aparece en la cadena actual.
También hay otras condiciones:
- Se debe asegurar que el caso de las letras no se tenga en cuenta al comparar. Simplemente transformamos ambas cadenas a minúsculas o mayúsculas.
- Excluimos de la comparación todos los no símbolos. Lo mejor es trabajar con .
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 a la utilización de en el fragmento anterior. Este método devuelve un array que contiene nombres o claves en el mismo orden en que aparecen en el objeto. En este caso, el array sería el siguiente:
['f', 'i', 'n', 'd', 'e', 'r']
De este modo, obtenemos propiedades del objeto sin necesidad de realizar un ciclo pesado. Se puede usar este método con la propiedad .length para verificar si ambas cadenas tienen la misma cantidad de caracteres, que es una característica importante de las anagramas.
Búsqueda de vocales
Es una tarea bastante simple que a menudo se presenta en entrevistas.
Enunciado
Necesitamos escribir una función que tome una cadena como argumento y devuelva la cantidad de vocales que contiene dicha cadena.
Las vocales son «a», «e», «i», «o», «u».
Ejemplo:
findVowels('hello') // -> 2
findVowels('why') // -> 0
Solución
Aquí está la forma más simple:
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 arrays. Vale la pena usarlo para identificar si un array contiene un valor determinado. Este método devuelve true si el array contiene el valor especificado y false si no.
También hay una solución más breve al problema:
const findVowels = str => {
const matched = str.match(/[aeiou]/gi)
return matched ? matched.length : 0
}Aquí se utiliza el método .match(), que permite realizar una búsqueda eficiente. Si la expresión regular como argumento del método se encuentra dentro de la cadena especificada, el valor devuelto es un array de los caracteres coincidentes. Si no hay coincidencias, .match() devuelve null.
Fibonacci
Un problema clásico que se puede encontrar en entrevistas de varios niveles. Cabe recordar que la secuencia de Fibonacci es una serie de números donde cada número siguiente es la suma de los dos anteriores. Así, los primeros diez números son: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.
Enunciado
Necesitamos escribir una función que devuelva el enésimo término de la secuencia dada, donde n es el número pasado como argumento a la función.
fibonacci(3) // -> 2
Esta tarea implica recorrer un ciclo la cantidad de veces indicada en el argumento, devolviendo el valor en la posición correspondiente. Este enfoque requiere el uso de ciclos. Sin embargo, si en su lugar utilizas recursión, puede gustarle al entrevistador y darte algunos puntos extra.
Solución
const fibonacci = num => {
// almacena la secuencia de Fibonacci que vas a
// generar dentro de un array e
// inicializa el array con los primeros dos
// números de la secuencia
const result = [0, 1]
for(let i = 2; i <= num; i++) {
// añade la suma de los dos números
// precedentes a la posición de i en el array result
// al final del array result
const prevNum1 = result[i - 1]
const prevNum2 = result[i - 2]
result.push(prevNum1 + prevNum2)
}
// devuelve el último valor en el array result
return result[num]
}En el array de resultados, los primeros dos números están en la fila, ya que cada elemento de la secuencia consiste en la suma de los dos números anteriores. Al principio, no hay dos números que se pueden tomar para calcular el siguiente número, por lo que el ciclo no puede generarlos automáticamente. Pero, como sabemos, los primeros dos números son siempre 0 y 1. Por lo tanto, podemos inicializar el array de resultados manualmente.
En cuanto a la recursión, aquí es más simple y complicado al mismo tiempo:
const fibonacci = num => {
// si num es 0 o 1, devuelve num
if(num < 2) {
return num
}
// recursión aquí
return fibonacci(num - 1) + fibonacci(num - 2)
}Continuamos llamando a fibonacci(), pasando números cada vez menores como argumentos. Nos detenemos cuando el argumento pasado es 0 o 1.
Salida
Probablemente ya te has encontrado con alguna de las tareas mencionadas, si pasaste entrevistas para un trabajo como desarrollador frontend o de JavaScript (especialmente si es a nivel junior). Pero si no las has encontrado, pueden ser útiles en el futuro, al menos para tu desarrollo general.
Skillbox recomienda:
- Curso en línea aplicado .
- Curso en línea .
- Curso práctico de un año .
Fuente: habr.com
