5 tarefas típicas de entrevista de JavaScript: análise e solucións

5 tarefas típicas de entrevista de JavaScript: análise e solucións

Do tradutor: publicou un artigo para ti Maria Antonietta Perna, que fala de tarefas comúns de JavaScript, ofrécese a maioría das veces aos solicitantes de programadores durante as entrevistas. O artigo será útil, en primeiro lugar, para os programadores novatos.

As entrevistas en empresas tecnolóxicas son durante moito tempo a conversa na cidade. Isto non debería ser sorprendente: pasar unha entrevista con éxito dáche a oportunidade de conseguir un bo traballo. Pero isto non é tan sinxelo, xa que moitas veces hai que resolver problemas complexos.

Ademais, na maioría das veces, a maioría destas tarefas non están relacionadas co traballo que realizará o solicitante, pero aínda teñen que ser resoltas. Ás veces tes que facelo no taboleiro, sen consultar con Google ou calquera outra fonte. Si, a situación está cambiando aos poucos, e algunhas empresas están abandonando este tipo de entrevistas, pero moitos empresarios seguen adheridos a esta tradición. Este artigo está dedicado á análise das tarefas típicas de JavaScript que adoitan usarse como tarefas para os que buscan emprego.

Recordámolo: para todos os lectores de "Habr" - un desconto de 10 rublos ao inscribirse en calquera curso de Skillbox usando o código promocional "Habr".

Skillbox recomenda: Curso práctico "Desenvolvedor móbil PRO".

O principal é prepararse a fondo para a súa entrevista.

Si, antes de comezar a ver as tarefas, vexamos algúns consellos xerais para preparar entrevistas.

O principal é preparar con antelación. Proba o ben que lembras os algoritmos e as estruturas de datos e mellora o teu coñecemento en áreas coas que non estás moi familiarizado. Hai moitas plataformas en liña que poden axudarche a preparar as entrevistas. Aconsellamos geeksforgeeks, Pramp, Entrevistando.io и Sinal de código.

Paga a pena aprender a dicir a decisión en voz alta. Aconséllase dicirlles aos aspirantes o que fai, e non só escribir no encerado (ou escribir código no ordenador, tamén en silencio). Deste xeito, se cometes un erro no código, pero a solución xeralmente é correcta, podes aumentar as túas posibilidades de éxito.

Debe entender o problema antes de comezar a resolvelo. Nalgúns casos, pode entender unha tarefa superficialmente e despois ir polo camiño equivocado. Pode valer a pena facerlle algunhas preguntas aclaratorias ao entrevistador.

Debes practicar a escritura de código a man, non nun ordenador. Ocorre que durante as entrevistas o solicitante recibe un rotulador e unha pizarra, onde non hai suxestións nin formato automático. Cando se busca unha solución, paga a pena anotar o seu código nun anaco de papel ou directamente no encerado. Se tes todo na cabeza, podes esquecer algo importante.

Tarefas de modelos en JavaScript

Algunhas destas tarefas probablemente xa che sexan familiares. Tiveches entrevistas nas que tiveches que resolver algo semellante ou practicaches nelas mentres aprendías JavaScript. Ben, agora toca resolvelos de novo, e cunha explicación detallada do proceso.

Palíndromo

Un palíndromo é unha palabra, oración ou secuencia de caracteres que se le exactamente igual tanto no sentido habitual como no sentido contrario. Por exemplo, "Anna" é un palíndromo, pero "table" e "John" non o son.

Posta en escena

Dada unha corda; cómpre escribir unha función que lle permita devolver verdadeiro se a cadea é un palíndromo, e falso se non. Neste caso, cómpre ter en conta os espazos e os signos de puntuación.

palíndromo('coche de carreiras') === verdadeiro
palíndromo('táboa') === falso

Imos analizar a tarefa

A idea principal aquí é invertir a corda. Se a cadea "inversa" é completamente idéntica á orixinal, entón recibimos un palíndromo e a función debería devolver verdadeiro. Se non, falso.

decisión

Aquí está o código que resolve o 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('')
}

O primeiro paso é converter os caracteres da cadea de entrada a minúsculas. Esta é unha garantía de que o programa comparará os propios personaxes, e non caso nin outra cousa.

O segundo paso é inverter a liña. Isto non é difícil de facer: cómpre convertelo nunha matriz usando o método .split() (biblioteca de cadeas). Despois invertimos a matriz usando .reverse() (biblioteca de matrices). O último paso é converter a matriz inversa nunha cadea usando .join() (biblioteca de matrices).

Agora só tes que comparar a cadea "inversa" coa cadea orixinal, devolvendo o resultado verdadeiro ou falso.

FizzBuzz

Unha das tarefas máis populares nas entrevistas.

Posta en escena

Debe escribir unha función que imprima números de 1 a n na consola, onde n é un número enteiro que a función toma como parámetro, coas seguintes condicións:

  • saída fizz en lugar de múltiplos de 3;
  • sair zumbido en lugar de números que son múltiplos de 5;
  • saída fizzbuzz en lugar de números que son múltiplos de 3 e 5.

Exemplo

Fizzbuzz (5)

Resultado

// 1
// 2
// efervescente
// 4
// zumbido

Imos analizar a tarefa

O principal aquí é unha forma de atopar múltiplos usando JavaScript. Pódese implementar mediante o operador módulo ou o resto - %, que permite mostrar o resto ao dividir dous números. Se o resto é 0, significa que o primeiro número é múltiplo do segundo.

12 % 5 // 2 -> 12 non é múltiplo de 5
12 % 3 // 0 -> 12 é múltiplo de 3

Entón, se divides 12 por 5, obtén 2 cun resto de 2. Se divides 12 por 3, obtén 4 cun resto de 0. No primeiro caso, 12 non é múltiplo de 5, no segundo. , 12 é múltiplo de 3.

decisión

A solución óptima sería o seguinte 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)
    }
  }
}

A función realiza as comprobacións necesarias mediante instrucións condicionais e produce o resultado requirido polo usuario. No problema, paga a pena prestar atención á orde das instrucións if...else: comeza cunha dobre condición (&&) e remata co caso no que non se puidesen atopar varios números. Como resultado, cubrimos todas as opcións.

Anagrama

Este é o nome dunha palabra que contén todas as letras doutra palabra no mesmo número, pero nunha orde diferente.

Posta en escena

Necesitamos escribir unha función que verifique se dúas cadeas son anagramas, e o caso non importa. Só se contan os caracteres; non se teñen en conta os espazos nin os signos de puntuación.

anagrama('buscador', 'Amigo') —> verdadeiro
anagrama('ola', 'adeus') —> falso

Imos analizar a tarefa

O importante a considerar aquí é que cómpre comprobar cada letra das dúas liñas de entrada e o seu número en cada liña.

buscador —> f: 1 amigo —> f: 1
i: 1 r: 1
n: 1 e: 1
d: 1 e: 1
e: 1 n: 1
r: 1 d: 1

Para almacenar datos de anagrama, debes escoller unha estrutura como un literal de obxecto JavaScript. A clave neste caso é o carácter da letra, o valor é o número das súas repeticións na liña actual.

Hai outras condicións:

  • Cómpre asegurarse de que o caso das letras non se teña en conta ao comparar. Simplemente convertemos ambas cadeas a minúsculas ou maiúsculas.
  • Excluímos todos os que non son personaxes da comparación. O mellor para traballar expresións regulares.

decisió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
}

Preste atención ao uso Obxecto.keys() no fragmento anterior. Este método devolve unha matriz que contén nomes ou claves na mesma orde na que aparecen no obxecto. Neste caso, a matriz será así:

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

Deste xeito obtemos as propiedades do obxecto sen ter que facer un bucle masivo. En caso de problema, pode usar este método coa propiedade .length para comprobar se ambas cadeas teñen o mesmo número de caracteres; esta é unha característica importante dos anagramas.

Busca vogais

Unha tarefa bastante sinxela que adoita aparecer nas entrevistas.

Posta en escena

Debe escribir unha función que tome unha cadea como argumento e devolva o número de vogais que están contidas na cadea.
As vogais son “a”, “e”, “i”, “o”, “u”.

Exemplo:

findVowels('ola') // —> 2
findVowels('por que') // —> 0

decisión

Aquí está a opción máis sinxela:

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
}

É importante prestar atención ao uso do método .includes(). Está dispoñible tanto para cadeas como para matrices. Debe usarse para determinar se unha matriz contén un determinado valor. Este método devolve true se a matriz contén o valor especificado e false se non o ten.

Hai unha solución máis breve para o problema:

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

Isto usa o método .match(), que che permite implementar unha busca eficiente. Se se atopa unha expresión regular como argumento de método dentro da cadea especificada, entón o valor de retorno é unha matriz de caracteres coincidentes. Ben, se non hai coincidencias, entón .match() devolve nulo.

Fibonacci

Unha tarefa clásica que se pode atopar nas entrevistas a varios niveis. Cabe lembrar que a sucesión de Fibonacci é unha serie de números onde cada un dos seguintes é a suma dos dous anteriores. Entón, os dez primeiros números teñen o seguinte aspecto: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Posta en escena

Debe escribir unha función que devolva o rexistro enésimo nunha determinada secuencia, sendo n o número que se pasa como argumento á función.

Fibonacci (3) // —> 2

Esta tarefa implica percorrer un bucle o número de veces especificado no argumento, devolvendo o valor na posición adecuada. Esta forma de plantexar o problema require o uso de bucles. Se usas a recursividade, pode agradar ao entrevistador e darche algúns puntos extra.

decisió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]
}

Na matriz de resultados, os dous primeiros números están contidos na serie porque cada entrada da secuencia é a suma dos dous números anteriores. Ao principio non hai dous números que se poidan tomar para obter o seguinte número, polo que o bucle non pode xeralos automaticamente. Pero, como sabemos, os dous primeiros números son sempre 0 e 1. Polo tanto, pode inicializar a matriz de resultados manualmente.

En canto á recursividade, todo é máis sinxelo e complicado ao mesmo tempo:

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 chamando a fibonacci(), pasando números cada vez máis pequenos como argumentos. Detémonos cando o argumento pasado é 0 ou 1.

Saída

O máis probable é que xa teña atopado algunha destas tarefas se foi entrevistado para un traballo de programador de frontend ou JavaScript (especialmente se é no nivel júnior). Pero se non os atopaches, poden ser útiles no futuro, polo menos para o desenvolvemento xeral.

Skillbox recomenda:

Fonte: www.habr.com

Engadir un comentario