Haastattelut teknologiayrityksissä ovat olleet pitkään puheenaiheet. Tämä ei ole yllättävää - haastattelun onnistunut suorittaminen mahdollistaa hyvän työn saamisen. Mutta tämä ei ole niin helppoa, koska usein on tarpeen ratkaista monimutkaisia ongelmia.
Lisäksi useimmiten useimmat näistä tehtävistä eivät liity hakijan suorittamaan työhön, mutta ne on silti ratkaistava. Joskus sinun on tehtävä se taululla tarkistamatta Googlesta tai muusta lähteestä. Kyllä, tilanne on vähitellen muuttumassa, ja joissakin yrityksissä he kieltäytyvät tällaisista haastatteluista, mutta monet työnantajat noudattavat edelleen tätä perinnettä. Tämä artikkeli on omistettu tyypillisten JavaScript-tehtävien analysointiin, joita käytetään usein hakijoiden tehtävinä.
Muistutamme sinua:kaikille "Habrin" lukijoille - 10 000 ruplan alennus ilmoittautuessaan mille tahansa Skillbox-kurssille "Habr" -tarjouskoodilla.
Tärkeintä on valmistautua haastatteluun huolellisesti.
Kyllä, ennen kuin alamme eritellä tehtäviä, katsotaanpa joitain yleisiä vinkkejä haastatteluun valmistautumiseen.
Tärkeintä on valmistautua etukäteen. Tarkista, kuinka hyvin muistat algoritmit ja tietorakenteet, ja paranna osaamistasi aloilla, jotka eivät ole sinulle kovin tuttuja. On olemassa monia online-alustoja, jotka auttavat sinua valmistautumaan haastatteluihin. Me neuvomme geeksforgeeks, Pramp, Haastattelu.io и CodeSignal.
Kannattaa opetella lausumaan päätös ääneen. On suositeltavaa kertoa hakijoille mitä olet tekemässä, eikä vain kirjoittaa taululle (tai kirjoittaa koodi tietokoneelle, myös hiljaa). Näin ollen, jos teet virheen koodissa, mutta ratkaisu on yleensä oikea, voit lisätä onnistumismahdollisuuksiasi.
Ongelma on ymmärrettävä ennen kuin ratkaisu voidaan aloittaa. Joissakin tapauksissa voit ymmärtää tehtävän pinnallisesti ja mennä sitten väärälle tielle. Kannattaa ehkä esittää haastattelijalle muutama selventävä kysymys.
Sinun täytyy harjoitella koodin kirjoittamista käsin, ei tietokoneella. Haastatteluissa hakijalle annetaan merkki ja taulu, jossa ei ole kehotteita tai automaattista muotoilua. Kun etsit ratkaisua, kirjoita koodisi paperille tai suoraan taululle. Jos pidät kaiken päässäsi, voit unohtaa jotain tärkeää.
Mallitehtävät JavaScriptissä
Olet todennäköisesti jo perehtynyt joihinkin näistä tehtävistä. Joko kävit haastatteluissa, joissa sinun piti ratkaista jotain vastaavaa, tai harjoittelit niitä oppiessasi JavaScriptiä. No, nyt on aika ratkaista ne uudelleen ja prosessin yksityiskohtainen selitys.
Palindromi
Palindromi on sana, lause tai merkkijono, joka lukee täsmälleen samalla tavalla sekä tavalliseen että vastakkaiseen suuntaan. Esimerkiksi "Anna" on palindromi, mutta "pöytä" ja "John" eivät ole.
tuotanto
Annettu merkkijono; sinun on kirjoitettava funktio, jonka avulla voit palauttaa tosi, jos merkkijono on palindromi, ja false muussa tapauksessa. Tässä tapauksessa välilyönnit ja välimerkit on otettava huomioon.
Pääideana tässä on kääntää merkkijono taaksepäin. Jos "käänteinen" merkkijono on täysin identtinen alkuperäisen kanssa, saamme palindromin ja funktion pitäisi palauttaa tosi. Jos ei, väärä.
päätös
Tässä on koodi, jonka avulla voit ratkaista palindromin.
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('')
}
Ensimmäinen vaihe on muuntaa syötettävien merkkijonojen merkit pieniksi kirjaimiksi. Tämä on takuu siitä, että ohjelma vertaa täsmälleen itse merkkejä, ei tapausta tai jotain muuta.
Toinen vaihe on rivin käänteinen. Tämä on helppo tehdä: se on muutettava taulukoksi .split()-menetelmällä (String-kirjasto). Sitten käännämme taulukon .reverse()-funktiolla (Matriisikirjasto). Viimeinen vaihe on muuntaa käänteinen taulukko merkkijonoksi komennolla .join() (Array-kirjasto).
Nyt tarvitsee vain verrata "käänteistä" merkkijonoa alkuperäiseen ja palauttaa tuloksen tosi tai epätosi.
kuohua
Yksi suosituimmista työhaastatteluista.
tuotanto
Konsoliin on kirjoitettava funktio, joka näyttää numeroita 1 - n, jossa n on kokonaisluku, jonka funktio ottaa parametriksi seuraavin ehdoin:
ulostulo fizz 3:n kerrannaisten sijaan;
buzz-lähtö 5:n kerrannaisten sijaan;
fizzbuzz-lähtö sekä 3:n että 5:n kerrannaisten sijaan.
Tärkeintä tässä on tapa löytää kerrannaisuudet JavaScriptin avulla. Se voidaan toteuttaa käyttämällä moduulioperaattoria tai jäännös -%, jolloin voit näyttää jäännöksen kahta lukua jaettaessa. Jos jäännös on 0, se tarkoittaa, että ensimmäinen luku on toisen kerrannainen.
12 % 5 // 2 -> 12 ei ole 5:n kerrannainen
12 % 3 // 0 -> 12 on 3:n kerrannainen
Joten, jos jaamme 12:n 5:llä, saamme 2:n jäännöksellä 2. Jos jaamme 12:lla 3:lla, saamme 4, jonka jäännös on 0. Ensimmäisessä tapauksessa 12 ei ole 5:n kerrannainen, toiseksi 12 on 3:n kerrannainen.
päätös
Paras ratkaisu olisi seuraava koodi:
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)
}
}
}
Toiminto suorittaa tarvittavat tarkistukset ehdollisten lausekkeiden avulla ja tuottaa käyttäjän vaatiman tuloksen. Tehtävässä kannattaa kiinnittää huomiota if...else-lauseiden järjestykseen: alkaen kaksoisehdolla (&&) ja päättyen tapaukseen, jossa useita lukuja ei löytynyt. Tämän seurauksena katamme kaikki vaihtoehdot.
Anagrammi
Tämä on sanan nimi, joka sisältää kaikki toisen sanan kirjaimet samassa numerossa, mutta eri järjestyksessä.
tuotanto
Meidän on kirjoitettava funktio, joka tarkistaa, ovatko kaksi merkkijonoa anagrammeja, ja kirjainten koolla ei ole väliä. Vain merkit lasketaan; välilyöntejä tai välimerkkejä ei oteta huomioon.
Anagrammitietojen tallentamiseen kannattaa valita rakenne, kuten JavaScript-objektikirjain. Avain tässä tapauksessa on kirjaimen merkki, arvo on sen toistojen lukumäärä nykyisellä rivillä.
Muitakin ehtoja on:
Sinun on varmistettava, että kirjainten kirjainkokoa ei oteta huomioon vertailussa. Muuta vain molemmat merkkijonot pieniksi tai isoiksi kirjaimille.
Jätämme vertailusta pois kaikki muut kuin merkit. Parasta työskennellä säännöllisiä lausekkeita.
päätös
// 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
}
Kiinnitä huomiota käyttöön Object.keys () yllä olevassa katkelmassa. Tämä menetelmä palauttaa taulukon, joka sisältää nimet tai avaimet samassa järjestyksessä kuin ne esiintyvät objektissa. Tässä tapauksessa taulukko on seuraavanlainen:
['f', 'i', 'n', 'd', 'e', 'r']
Näin saamme kohteen ominaisuudet ilman isoa silmukkaa. Tehtävässä voit käyttää tätä menetelmää ominaisuuden .length kanssa - tarkistaaksesi, onko molemmissa merkkijonoissa sama määrä merkkejä - tämä on tärkeä anagrammien ominaisuus.
Vokaalihaku
Melko yksinkertainen tehtävä, joka tulee usein vastaan haastatteluissa.
tuotanto
Sinun on kirjoitettava funktio, joka ottaa merkkijonon argumenttina ja palauttaa merkkijonon sisältämien vokaalien määrän.
Vokaalit ovat "a", "e", "i", "o", "u".
On tärkeää kiinnittää huomiota .includes()-menetelmän käyttöön. Se on saatavana sekä merkkijonoille että taulukoille. Sitä tulisi käyttää selvittämään, sisältääkö taulukko tietyn arvon. Tämä menetelmä palauttaa tosi, jos taulukko sisältää määritetyn arvon, ja false muussa tapauksessa.
Tässä käytetään .match()-menetelmää, jonka avulla voit toteuttaa tehokkaan haun. Jos säännöllinen lauseke menetelmäargumenttina löytyy määritetystä merkkijonosta, palautusarvo on joukko vastaavia merkkejä. No, jos osumia ei ole, .match() palauttaa null.
Fibonacci
Klassinen tehtävä, johon voi vastata eritasoisissa haastatteluissa. On syytä muistaa, että Fibonacci-sekvenssi on numerosarja, jossa jokainen seuraava on kahden edellisen summa. Joten ensimmäiset kymmenen numeroa näyttävät tältä: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.
tuotanto
Sinun on kirjoitettava funktio, joka palauttaa n:nnen tietueen tietyssä järjestyksessä, ja n on luku, joka välitetään funktiolle argumenttina.
fibonacci(3) // --> 2
Tässä tehtävässä käydään läpi argumentissa määritetty määrä kertoja ja palautetaan arvo oikeaan kohtaan. Tämä tapa ratkaista ongelma edellyttää silmukoiden käyttöä. Jos käytät sen sijaan rekursiota, haastattelija saattaa pitää siitä ja antaa sinulle muutaman lisäpisteen.
päätös
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]
}
Tulostaulukossa kaksi ensimmäistä numeroa sisältyvät riviin, koska jokainen sekvenssin merkintä koostuu kahden edellisen luvun summasta. Aivan alussa ei ole kahta numeroa, jotka voidaan ottaa seuraavan luvun saamiseksi, joten silmukka ei voi luoda niitä automaattisesti. Mutta kuten tiedämme, kaksi ensimmäistä numeroa ovat aina 0 ja 1. Siksi voit alustaa tulostaulukon manuaalisesti.
Mitä tulee rekursioon, kaikki on yksinkertaisempaa ja monimutkaisempaa samanaikaisesti:
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)
}
Kutsumme jatkuvasti fibonacci(a) ja välitämme yhä pienempiä numeroita argumentteina. Pysähdymme, kun hyväksytty argumentti on 0 tai 1.
johtopäätös
Todennäköisesti olet jo kohdannut jonkin näistä tehtävistä, jos olit haastattelussa frontend- tai JavaScript-kehittäjän työstä (varsinkin jos kyseessä on junioritaso). Mutta jos et törmännyt niihin, niistä voi olla hyötyä tulevaisuudessa - ainakin yleisen kehityksen kannalta.