5 sarcini tipice de interviu JavaScript: analiză și soluții

5 sarcini tipice de interviu JavaScript: analiză și soluții

De la traducător: a publicat un articol pentru tine Maria Antonietta Perna, care vorbește despre sarcini JavaScript comune, cel mai adesea oferit aplicanților dezvoltatori în timpul interviurilor. Articolul va fi util, în primul rând, programatorilor începători.

Interviurile la companiile de tehnologie au fost de multă vreme de vorbă în oraș. Acest lucru nu ar trebui să fie surprinzător - trecerea cu succes a unui interviu vă oferă oportunitatea de a obține un loc de muncă bun. Dar acest lucru nu este atât de simplu, deoarece problemele complexe trebuie adesea rezolvate.

Mai mult, de cele mai multe ori, cele mai multe dintre aceste sarcini nu sunt legate de munca pe care o va efectua solicitantul, dar tot trebuie rezolvate. Uneori trebuie să o faci pe bord, fără a verifica cu Google sau orice altă sursă. Da, situația se schimbă treptat, iar unele companii renunță la astfel de interviuri, dar mulți angajatori încă aderă la această tradiție. Acest articol este dedicat analizei sarcinilor JavaScript tipice care sunt adesea folosite ca sarcini pentru cei care caută un loc de muncă.

Amintim: pentru toți cititorii „Habr” - o reducere de 10 de ruble la înscrierea la orice curs Skillbox folosind codul promoțional „Habr”.

Skillbox recomandă: Curs practic „Dezvoltator mobil PRO”.

Principalul lucru este să vă pregătiți temeinic pentru interviu.

Da, înainte de a începe să analizăm sarcinile, să ne uităm la câteva sfaturi generale de pregătire a interviului.

Principalul lucru este să vă pregătiți în avans. Testați cât de bine vă amintiți algoritmii și structurile de date și îmbunătățiți-vă cunoștințele în domenii cu care nu sunteți prea familiarizat. Există multe platforme online care vă pot ajuta să vă pregătiți pentru interviuri. Sfatuim geeksforgeeks, Premp, Interviu.io и CodeSignal.

Merită să înveți să spui decizia cu voce tare. Este recomandabil să le spuneți aplicanților ceea ce faceți, și nu doar să scrieți pe tablă (sau să introduceți codul în computer, de asemenea în tăcere). Astfel, dacă greșești în cod, dar soluția este în general corectă, îți poți crește șansele de reușită.

Trebuie să înțelegeți problema înainte de a începe să o rezolvați. În unele cazuri, puteți înțelege o sarcină superficial și apoi mergeți pe calea greșită. S-ar putea să merite să puneți câteva întrebări clarificatoare intervievatorului.

Trebuie să exersați scrierea codului manual, nu pe un computer. Se întâmplă ca în timpul interviurilor solicitantului să i se acorde un marker și o tablă, unde nu există indicii sau formatare automată. Când căutați o soluție, merită să vă scrieți codul pe o bucată de hârtie sau direct pe tablă. Dacă ții totul în cap, s-ar putea să uiți ceva important.

Șablon de sarcini în JavaScript

Unele dintre aceste sarcini vă sunt probabil deja familiare. Fie ați avut interviuri în care a trebuit să rezolvați ceva similar, fie ați exersat pe ele în timp ce învățați JavaScript. Ei bine, acum este timpul să le rezolvăm din nou și cu o explicație detaliată a procesului.

Palindrom

Un palindrom este un cuvânt, o propoziție sau o secvență de caractere care se citește exact la fel atât în ​​direcția obișnuită, cât și în direcția opusă. De exemplu, „Anna” este un palindrom, dar „masa” și „Ioan” nu sunt.

producere

Dat un șir; trebuie să scrieți o funcție care vă permite să returnați adevărat dacă șirul este un palindrom și fals dacă nu. În acest caz, trebuie să țineți cont de spații și semne de punctuație.

palindrom('mașină de curse') === adevărat
palindrom('tabel') === fals

Să analizăm sarcina

Ideea principală aici este să inversați șirul. Dacă șirul „invers” este complet identic cu cel original, atunci am primit un palindrom și funcția ar trebui să returneze true. Dacă nu, fals.

decizie

Iată codul care rezolvă palindromul.

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

Primul pas este să convertiți caracterele din șirul de intrare în litere mici. Aceasta este o garanție că programul va compara personajele în sine, și nu majuscule sau orice altceva.

Al doilea pas este inversarea liniei. Acest lucru nu este dificil de făcut: trebuie să îl convertiți într-o matrice folosind metoda .split() (bibliotecă String). Apoi inversăm matricea folosind .reverse() (Biblioteca de matrice). Ultimul pas este convertirea matricei inverse într-un șir folosind .join() (Biblioteca Array).

Acum tot ce trebuie să faceți este să comparați șirul „invers” cu șirul original, returnând rezultatul adevărat sau fals.

FizzBuzz

Una dintre cele mai populare sarcini în interviuri.

producere

Trebuie să scrieți o funcție care imprimă numere de la 1 la n în consolă, unde n este un număr întreg pe care funcția îl ia ca parametru, cu următoarele condiții:

  • ieșire fizz în loc de multipli de 3;
  • emite buzz în loc de numere care sunt multipli de 5;
  • ieșire fizzbuzz în loc de numere care sunt multipli de 3 și 5.

Exemplu

Fizzbuzz(5)

Rezultat

// 1
// 2
// fizz
// 4
//zâmbit

Să analizăm sarcina

Principalul lucru aici este o modalitate de a găsi multipli folosind JavaScript. Poate fi implementat folosind operatorul modul sau restul - %, care vă permite să afișați restul la împărțirea a două numere. Dacă restul este 0, înseamnă că primul număr este un multiplu al celui de-al doilea.

12% 5 // 2 -> 12 nu este un multiplu al lui 5
12% 3 // 0 -> 12 este multiplu al lui 3

Deci, dacă împărțiți 12 la 5, obțineți 2 cu un rest de 2. Dacă împărțiți 12 la 3, obțineți 4 cu restul de 0. În primul caz, 12 nu este multiplu de 5, în al doilea. , 12 este un multiplu al lui 3.

decizie

Soluția optimă ar fi următorul cod:

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)
    }
  }
}

Funcția efectuează verificările necesare folosind instrucțiuni condiționale și produce rezultatul cerut de utilizator. În problemă, merită să fiți atenți la ordinea declarațiilor if...else: începeți cu o condiție dublă (&&) și terminați cu cazul în care nu s-au găsit mai multe numere. Drept urmare, acoperim toate opțiunile.

Anagramă

Acesta este numele unui cuvânt care conține toate literele altui cuvânt în același număr, dar într-o ordine diferită.

producere

Trebuie să scriem o funcție care verifică dacă două șiruri sunt anagrame, iar cazul nu contează. Sunt numărate doar caracterele; nu se iau în considerare spațiile sau semnele de punctuație.

anagramă(„găsește”, „Prieten”) —> adevărat
anagrama('bună', 'pa') —> fals

Să analizăm sarcina

Lucrul important de luat în considerare aici este că trebuie să verificați fiecare literă din cele două linii de introducere și numărul lor în fiecare rând.

găsitor —> f: 1 prieten —> f: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r: 1 d: 1

Pentru a stoca date de anagramă, ar trebui să alegeți o structură, cum ar fi un obiect JavaScript literal. Cheia în acest caz este caracterul literei, valoarea este numărul repetărilor acesteia în linia curentă.

Sunt si alte conditii:

  • Trebuie să vă asigurați că cazul literelor nu este luat în considerare la comparare. Pur și simplu convertim ambele șiruri în litere mici sau mari.
  • Excludem toate non-personajele din comparație. Cel mai bine să lucrezi expresii obisnuite.

decizie

// 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
}

Acordați atenție utilizării Object.keys () în fragmentul de mai sus. Această metodă returnează o matrice care conține nume sau chei în aceeași ordine în care apar în obiect. În acest caz, matricea va fi astfel:

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

În acest fel obținem proprietățile obiectului fără a fi nevoie să facem o buclă în bloc. Într-o problemă, puteți utiliza această metodă cu proprietatea .length pentru a verifica dacă ambele șiruri au același număr de caractere - aceasta este o caracteristică importantă a anagramelor.

Căutați vocale

O sarcină destul de simplă care apare adesea în interviuri.

producere

Trebuie să scrieți o funcție care ia un șir ca argument și returnează numărul de vocale conținute în șir.
Vocalele sunt „a”, „e”, „i”, „o”, „u”.

Exemplu:

găsi vocale('bună ziua') // —> 2
găsi vocale('de ce') // —> 0

decizie

Iată cea mai simplă opțiune:

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
}

Este important să acordați atenție utilizării metodei .includes(). Este disponibil atât pentru șiruri, cât și pentru matrice. Ar trebui folosit pentru a determina dacă o matrice conține o anumită valoare. Această metodă returnează true dacă tabloul conține valoarea specificată și false dacă nu.

Există o soluție mai scurtă a problemei:

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

Aceasta folosește metoda .match(), care vă permite să implementați o căutare eficientă. Dacă o expresie regulată ca argument de metodă este găsită în interiorul șirului specificat, atunci valoarea returnată este o matrice de caractere care se potrivesc. Ei bine, dacă nu există potriviri, atunci .match() returnează null.

Fibonacci

O sarcină clasică care poate fi găsită în interviuri la diferite niveluri. Merită să ne amintim că șirul lui Fibonacci este o serie de numere în care fiecare următor este suma celor două anterioare. Astfel, primele zece numere arată astfel: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

producere

Trebuie să scrieți o funcție care returnează a n-a înregistrare într-o anumită secvență, n fiind numărul care este transmis ca argument funcției.

Fibonacci(3) // —> 2

Această sarcină implică parcurgerea unei bucle de numărul de ori specificat în argument, returnând valoarea în poziția corespunzătoare. Acest mod de a pune problema necesită utilizarea buclelor. Dacă folosiți recursiunea în schimb, aceasta poate fi pe placul intervievatorului și vă poate oferi câteva puncte în plus.

decizie

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

În tabloul de rezultate, primele două numere sunt conținute în serie deoarece fiecare intrare din succesiune este suma celor două numere anterioare. La început, nu există două numere care să poată fi luate pentru a obține următorul număr, așa că bucla nu le poate genera automat. Dar, după cum știm, primele două numere sunt întotdeauna 0 și 1. Prin urmare, puteți inițializa matricea de rezultate manual.

În ceea ce privește recursiunea, totul este mai simplu și mai complicat în același timp:

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)
}

Continuăm să numim Fibonacci(), trecând numere din ce în ce mai mici drept argumente. Ne oprim atunci când argumentul transmis este 0 sau 1.

Producție

Cel mai probabil, ați întâlnit deja oricare dintre aceste sarcini dacă ați fost intervievat pentru un job de dezvoltator frontend sau JavaScript (mai ales dacă este la nivel de juniori). Dar dacă nu le-ați întâlnit, ele pot fi utile în viitor - cel puțin pentru dezvoltarea generală.

Skillbox recomandă:

Sursa: www.habr.com

Adauga un comentariu