5 tarefas típicas de entrevista em JavaScript: análise e soluções

5 tarefas típicas de entrevista em JavaScript: análise e soluções

Do tradutor: publicou um artigo para você Maria Antonietta Perna, que fala sobre tarefas comuns de JavaScript, oferecido com mais frequência aos candidatos a desenvolvedores durante as entrevistas. O artigo será útil principalmente para programadores novatos.

Entrevistas em empresas de tecnologia sempre foram o assunto da cidade. Isso não deveria ser surpreendente - passar com sucesso em uma entrevista lhe dá a oportunidade de conseguir um bom emprego. Mas isso não é tão simples, pois muitas vezes problemas complexos precisam ser resolvidos.

Além disso, na maioria das vezes, a maioria dessas tarefas não está relacionada ao trabalho que o candidato irá realizar, mas ainda precisam ser resolvidas. Às vezes você tem que fazer isso no quadro, sem consultar o Google ou qualquer outra fonte. Sim, a situação está mudando gradativamente e algumas empresas estão abandonando essas entrevistas, mas muitos empregadores ainda seguem essa tradição. Este artigo é dedicado à análise de tarefas típicas de JavaScript que são frequentemente usadas como tarefas para quem procura emprego.

Lembramos: para todos os leitores de "Habr" - um desconto de 10 rublos ao se inscrever em qualquer curso Skillbox usando o código promocional "Habr".

A Skillbox recomenda: curso prático "Desenvolvedor móvel PRO".

O principal é se preparar bem para a entrevista.

Sim, antes de começarmos a analisar as tarefas, vejamos algumas dicas gerais de preparação para entrevistas.

O principal é se preparar com antecedência. Teste o quão bem você se lembra de algoritmos e estruturas de dados e aprimore seu conhecimento em áreas com as quais você não está muito familiarizado. Existem muitas plataformas online que podem ajudá-lo a se preparar para entrevistas. Nós aconselhamos GeeksparaGeeks, carrinho de bebê, Entrevistando.io и CodeSignal.

Vale a pena aprender a dizer a decisão em voz alta. É aconselhável contar aos candidatos o que você faz, e não apenas escrever no quadro (ou digitar o código no computador, também silenciosamente). Dessa forma, se você cometer um erro no código, mas a solução geralmente estiver correta, você poderá aumentar suas chances de sucesso.

Você precisa entender o problema antes de começar a resolvê-lo. Em alguns casos, você pode entender uma tarefa superficialmente e depois seguir o caminho errado. Pode valer a pena fazer algumas perguntas esclarecedoras ao entrevistador.

Você precisa praticar a escrita de código manualmente, não em um PC. Acontece que durante as entrevistas o candidato recebe um marcador e um quadro branco, onde não há dicas ou formatação automática. Na hora de buscar uma solução, vale anotar seu código em um pedaço de papel ou diretamente no quadro. Se você mantiver tudo na cabeça, poderá esquecer algo importante.

Tarefas de modelo em JavaScript

Algumas dessas tarefas provavelmente já são familiares para você. Você já teve entrevistas em que teve que resolver algo semelhante ou praticou enquanto aprendia JavaScript. Bom, agora é hora de resolvê-los novamente, e com uma explicação detalhada do processo.

Palíndromo

Um palíndromo é uma palavra, frase ou sequência de caracteres que é lida exatamente da mesma forma, tanto na direção usual quanto na direção oposta. Por exemplo, “Anna” é um palíndromo, mas “mesa” e “John” não são.

Estadiamento

Dada uma string; você precisa escrever uma função que permita retornar verdadeiro se a string for um palíndromo e falso se não for. Nesse caso, é necessário levar em consideração espaços e sinais de pontuação.

palíndromo('carro de corrida') === verdadeiro
palíndromo('tabela') === falso

Vamos analisar a tarefa

A ideia principal aqui é inverter a string. Se a string “reversa” for completamente idêntica à original, então recebemos um palíndromo e a função deve retornar verdadeiro. Se não, falso.

Solução

Aqui 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('')
}

A primeira etapa é converter os caracteres da string de entrada para minúsculas. Esta é uma garantia de que o programa irá comparar os próprios caracteres, e não maiúsculas e minúsculas ou qualquer outra coisa.

O segundo passo é inverter a linha. Isso não é difícil de fazer: você precisa convertê-lo em um array usando o método .split() (biblioteca String). Em seguida, invertemos o array usando .reverse() (biblioteca Array). A última etapa é converter o array reverso em uma string usando .join() (biblioteca Array).

Agora tudo que você precisa fazer é comparar a string “reversa” com a string original, retornando o resultado verdadeiro ou falso.

FizzBuzz

Uma das tarefas mais populares em entrevistas.

Estadiamento

Você precisa escrever uma função que imprima números de 1 a n no console, onde n é um número inteiro que a função toma como parâmetro, com as seguintes condições:

  • saída efervescente em vez de múltiplos de 3;
  • produza buzz em vez de números múltiplos de 5;
  • saída fizzbuzz em vez de números múltiplos de 3 e 5.

Exemplo

Fizzbuzz(5)

resultado

/ / 1
/ / 2
// efervescer
/ / 4
//zumbido

Vamos analisar a tarefa

O principal aqui é uma maneira de encontrar múltiplos usando JavaScript. Pode ser implementado usando o operador módulo ou resto -%, que permite mostrar o resto ao dividir dois números. Se o resto for 0, significa que o primeiro número é múltiplo do segundo.

12% 5 // 2 -> 12 não é múltiplo de 5
12% 3 // 0 -> 12 é múltiplo de 3

Então, se você dividir 12 por 5, obtém 2 com resto de 2. Se dividir 12 por 3, obtém 4 com resto de 0. No primeiro caso, 12 não é múltiplo de 5, no segundo , 12 é um múltiplo de 3.

Solução

A solução ideal seria 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 função realiza as verificações necessárias usando instruções condicionais e produz o resultado exigido pelo usuário. No problema, vale a pena prestar atenção à ordem das instruções if...else: comece com uma condição dupla (&&) e termine com o caso em que vários números não foram encontrados. Como resultado, cobrimos todas as opções.

Anagrama

Este é o nome de uma palavra que contém todas as letras de outra palavra no mesmo número, mas em ordem diferente.

Estadiamento

Precisamos escrever uma função que verifique se duas strings são anagramas, e o caso não importa. Apenas caracteres são contados; espaços ou sinais de pontuação não são levados em consideração.

anagrama('localizador', 'Amigo') -> verdadeiro
anagrama('olá', 'tchau') -> falso

Vamos analisar a tarefa

O importante a considerar aqui é que você precisa verificar cada letra nas duas linhas de entrada e seu número em cada linha.

localizador -> f: 1 amigo -> f: 1
eu: 1 r: 1
n: 1 eu: 1
d: 1 e: 1
e: 1 n: 1
r: 1 d: 1

Para armazenar dados de anagramas, você deve escolher uma estrutura como um literal de objeto JavaScript. A chave neste caso é o caractere da letra, o valor é o número de suas repetições na linha atual.

Existem outras condições:

  • Você precisa ter certeza de que a caixa das letras não é levada em consideração na comparação. Simplesmente convertemos ambas as strings para minúsculas ou maiúsculas.
  • Excluímos todos os não-caracteres da comparação. Melhor para trabalhar expressões regulares.

Solução

// 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 atenção ao uso Object.keys () no trecho acima. Este método retorna um array contendo nomes ou chaves na mesma ordem em que aparecem no objeto. Neste caso o array ficará assim:

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

Dessa forma obtemos as propriedades do objeto sem precisar fazer um loop em massa. Em um problema, você pode usar este método com a propriedade .length para verificar se ambas as strings possuem o mesmo número de caracteres - esse é um recurso importante dos anagramas.

Procure por vogais

Uma tarefa bastante simples que costuma surgir em entrevistas.

Estadiamento

Você precisa escrever uma função que receba uma string como argumento e retorne o número de vogais contidas na string.
As vogais são “a”, “e”, “i”, “o”, “u”.

Exemplo:

findVowels('olá') // —> 2
findVowels('porquê') // —> 0

Solução

Aqui está a opção mais simples:

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 atenção ao uso do método .includes(). Ele está disponível para strings e arrays. Deve ser usado para determinar se uma matriz contém um determinado valor. Este método retorna verdadeiro se o array contiver o valor especificado e falso se não contiver.

Existe uma solução mais curta para o problema:

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

Isso usa o método .match(), que permite implementar uma pesquisa eficiente. Se uma expressão regular como argumento de método for encontrada dentro da string especificada, o valor de retorno será uma matriz de caracteres correspondentes. Bem, se não houver correspondências, .match() retornará nulo.

Fibonacci

Uma tarefa clássica que pode ser encontrada em entrevistas de vários níveis. Vale lembrar que a sequência de Fibonacci é uma série de números onde cada número subsequente é a soma dos dois anteriores. Então, os primeiros dez números são assim: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Estadiamento

Você precisa escrever uma função que retorne o enésimo registro em uma determinada sequência, sendo n o número que é passado como argumento para a função.

fibonacci(3) // -> 2

Esta tarefa envolve percorrer um loop o número de vezes especificado no argumento, retornando o valor na posição apropriada. Esta forma de colocar o problema requer o uso de loops. Se você usar a recursão, isso poderá agradar ao entrevistador e lhe render alguns pontos extras.

Solução

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 dois primeiros números estão contidos na série porque cada entrada na sequência é a soma dos dois números anteriores. No início, não há dois números que possam ser usados ​​para obter o próximo número, portanto o loop não pode gerá-los automaticamente. Mas, como sabemos, os dois primeiros números são sempre 0 e 1. Portanto, você pode inicializar a matriz de resultados manualmente.

Quanto à recursão, tudo é mais simples 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)
}

Continuamos chamando fibonacci(), passando números cada vez menores como argumentos. Paramos quando o argumento passado é 0 ou 1.

Jogar aviator online grátis: hack aviator funciona

Provavelmente, você já encontrou alguma dessas tarefas se foi entrevistado para um trabalho de desenvolvedor front-end ou JavaScript (especialmente se for no nível júnior). Mas se você ainda não os encontrou, eles podem ser úteis no futuro - pelo menos para o desenvolvimento geral.

A Skillbox recomenda:

Fonte: habr.com

Adicionar um comentário