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



De um tradutor: eles publicaram um artigo de Maria Perna (Maria Antonietta Perna), que fala sobre tarefas típicas em JavaScript , mais frequentemente oferecidas a candidatos a emprego-desenvolvedores em entrevistas. O artigo será útil principalmente para programadores iniciantes. Abaixo estão exemplos de solução de problemas, se parecer que eles não são muito bons e há uma opção melhor - sugira uma alternativa nos comentários.

Entrevistas em empresas de tecnologia têm sido um sinônimo. Isso não deve ser surpreendido - uma entrevista bem-sucedida oferece a oportunidade de conseguir um bom emprego. Mas isso não é tão simples, pois muitas vezes é necessário resolver problemas complexos.

E, na maioria das vezes, a maioria dessas tarefas não está relacionada ao trabalho que o candidato executará, mas ainda precisa ser resolvida. Às vezes, você precisa fazer isso no quadro, sem consultar o Google ou qualquer outra fonte. Sim, a situação está mudando gradualmente, e algumas empresas recusam tais entrevistas, mas muitos empregadores ainda aderem a essa tradição. Este artigo é dedicado à análise de tarefas típicas de JavaScript, geralmente usadas como tarefas para candidatos.

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

A Skillbox recomenda: Curso prático "Mobile Developer PRO" .

O principal é uma preparação cuidadosa para sua entrevista


Sim, antes de começar a desmontar as tarefas, vejamos dicas gerais para se preparar para uma entrevista.

O principal é se preparar com antecedência. Verifique como você se lembra dos algoritmos e estruturas de dados e obtenha conhecimento em áreas com as quais você não está muito familiarizado. Existem muitas plataformas online que ajudam a se preparar para entrevistas. Recomendamos GeeksforGeeks , Pramp , Interviewing.io e CodeSignal .

Vale a pena aprender a pronunciar a decisão em voz alta. É aconselhável dizer aos candidatos o que você está fazendo, e não apenas escrever no quadro (ou código de tipo no computador, também silenciosamente). Portanto, se você cometer um erro no código, mas a decisão for geralmente correta, você poderá aumentar suas chances de sucesso.

O problema deve ser compreendido antes de prosseguir com a solução. Em alguns casos, você pode entender superficialmente a tarefa e 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. Ocorre que durante as entrevistas o candidato recebe um marcador e um quadro onde não há dicas ou formatação automática. Ao procurar uma solução, escreva seu código em um pedaço de papel ou diretamente no quadro. Se você mantiver tudo em mente, poderá esquecer algo importante.

Tarefas de modelo JavaScript


Provavelmente algumas dessas tarefas já lhe são familiares. Você passou por entrevistas nas quais teve que resolver algo semelhante ou as praticou enquanto aprendia JavaScript. Bem, agora é hora de resolvê-los novamente, com uma explicação detalhada do processo.

Palíndromo

Um palíndromo é uma palavra, sentença ou sequência de caracteres que podem ser lidos exatamente da mesma forma, tanto na direção usual quanto na oposta. Por exemplo, "Anna" é um palíndromo, mas "mesa" e "João" não são.

Estadiamento

Dada uma string; você precisa escrever uma função que permita retornar true se a string for um palíndromo e false se não. Nesse caso, você precisa considerar espaços e sinais de pontuação.

palíndromo ('carro de corrida') === true
palíndromo ('tabela') === false

Desmontamos a tarefa

A idéia principal aqui é virar a linha na direção oposta. Se a linha “reversa” for completamente idêntica à original, obtemos um palíndromo e a função deve retornar verdadeira. 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('') } 

O primeiro passo é converter os caracteres da sequência de entrada em minúsculas. Esta é uma garantia de que o programa irá comparar exatamente os caracteres em si, e não o caso ou outra coisa.

O segundo passo é inverter a linha. Isso é fácil de fazer: você precisa convertê-lo em uma matriz usando o método .split () (biblioteca de strings). Em seguida, invertemos o array usando .reverse () (biblioteca Array). A última etapa é converter a matriz inversa em uma seqüência de caracteres usando .join () (biblioteca de matriz).

Agora, tudo o que é necessário é comparar a cadeia "reversa" com a original, retornando o resultado verdadeiro ou falso.

Fizzbuzz

Uma das tarefas de entrevista mais populares.

Estadiamento

É necessário escrever uma função que exiba números de 1 a n no console, em que n é um número inteiro que a função usa como parâmetro, com as seguintes condições:

  • saída de fizz em vez de múltiplos de 3;
  • saída de zumbido em vez de múltiplos de 5;
  • fizzbuzz em vez de números que são múltiplos de 3 e 5.

Exemplo

Fizzbuzz (5)

Resultado

// 1
// 2
// fizz
// 4
// buzz

Desmontamos a tarefa

A principal coisa aqui é a maneira de procurar vários números usando JavaScript. Pode ser implementado usando o operador do módulo ou o restante -%, o que permite mostrar o restante ao dividir dois números. Se o restante for 0, isso significa que o primeiro número é um múltiplo do segundo.

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

Portanto, se dividirmos 12 por 5, obteremos 2 com o restante 2. Se dividirmos 12 por 3, obteremos 4 com o restante 0. No primeiro caso, 12 não é um múltiplo de 5, no segundo - 12 é um múltiplo de 3.

Solução

A melhor solução 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 executa as verificações necessárias usando instruções condicionais e produz o resultado que o usuário precisa. A tarefa deve 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 puderam ser encontrados. Como resultado, cobrimos todas as opções.

Anagrama

Este é o nome de uma palavra que contém todas as letras de outra palavra na mesma quantidade, mas em uma ordem diferente.

Estadiamento

Você precisa escrever uma função que verifique se duas linhas são anagramas, e o caso das letras não importa. Somente caracteres são levados em consideração; espaços ou pontuação não são levados em consideração.

anagrama ('localizador', 'Amigo') -> true
anagrama ('olá', 'tchau') -> false

Desmontamos a tarefa

É importante considerar que é necessário verificar cada letra em duas linhas de entrada e seu número em cada linha.

localizador -> f: 1 amigo -> f: 1
i: 1 r: 1
n: 1 i: 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 símbolo da letra, o valor é o número de suas repetições na linha atual.

Existem outras condições:

  • Você precisa garantir que o caso das letras não seja levado em consideração ao comparar. Basta converter as duas strings em minúsculas ou maiúsculas.
  • Excluímos da comparação todos os não caracteres. É melhor trabalhar com 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 } 

Observe o uso de Object.keys () no snippet acima. Este método retorna uma matriz que contém os nomes ou chaves na mesma ordem em que aparecem no objeto. Nesse caso, a matriz será assim:

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

Assim, obtemos as propriedades do objeto sem a necessidade de executar um ciclo de volume. Na tarefa, você pode usar esse método com a propriedade .length - para verificar se o mesmo número de caracteres está nas duas linhas - esse é um recurso importante dos anagramas.

Pesquisa por vogal

Uma tarefa bastante simples que geralmente aparece nas entrevistas.

Estadiamento

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

Um exemplo:

findVowels ('hello') // -> 2
findVowels ('why') // -> 0

Solução

Aqui está a opção mais 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 } 

É importante prestar atenção ao uso do método .includes (). Está disponível para cadeias de caracteres e matrizes. Deve ser usado para determinar se uma matriz contém um valor específico. Este método retorna true se a matriz contém o valor especificado e false se não.

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

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

Isso envolve o método .match (), que permite implementar uma pesquisa eficiente. Se a expressão regular como argumento para o método for encontrada dentro da cadeia especificada, a matriz de caracteres correspondentes se tornará o valor retornado. 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, em que cada subsequente é a soma das duas anteriores. Portanto, os dez primeiros números são os seguintes: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Estadiamento

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

fibonacci (3) // -> 2

Essa tarefa envolve fazer o loop tantas vezes quanto especificado no argumento, retornando o valor na posição apropriada. Este método de declaração do problema requer o uso de ciclos. Se você usar recursão, o entrevistador pode gostar e fornecer 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 em uma linha, pois cada registro na sequência consiste na soma dos dois números anteriores. No início, não há dois números que você pode usar para obter o próximo número, portanto o ciclo não pode gerá-los no modo automático. Mas, como sabemos, os dois primeiros números são sempre 0 e 1. Portanto, você pode inicializar uma matriz de resultados manualmente.

Quanto à recursão, tudo aqui é mais simples e mais 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.

Conclusão


Provavelmente, você já encontrou alguma dessas tarefas se foi entrevistado para o trabalho do desenvolvedor de front-end ou JavaScript (especialmente se esse for o nível júnior). Mas se eles não aparecerem com você, poderão ser úteis no futuro - pelo menos para o desenvolvimento geral.
A Skillbox recomenda:

Source: https://habr.com/ru/post/pt445360/


All Articles