Viðtöl hjá tæknifyrirtækjum hafa lengi verið í umræðunni. Þetta ætti ekki að koma á óvart - að standast viðtal með góðum árangri gefur þér tækifæri til að fá góða vinnu. En þetta er ekki svo einfalt, þar sem oft þarf að leysa flókin vandamál.
Þar að auki eru flest þessi verkefni ekki tengd vinnunni sem umsækjandi mun sinna, en samt þarf að leysa þau. Stundum þarftu að gera það á borðinu, án þess að athuga með Google eða öðrum heimildum. Já, ástandið er smám saman að breytast og sum fyrirtæki hætta við slík viðtöl, en margir vinnuveitendur halda samt í þessa hefð. Þessi grein er helguð greiningu á dæmigerðum JavaScript verkefnum sem eru oft notuð sem verkefni fyrir atvinnuleitendur.
Við minnum á:fyrir alla Habr lesendur - 10 rúblur afsláttur þegar þú skráir þig á hvaða Skillbox námskeið sem er með því að nota Habr kynningarkóðann.
Aðalatriðið er að undirbúa þig vel fyrir viðtalið þitt.
Já, áður en við byrjum að skoða verkefnin skulum við skoða nokkur almenn viðtalsundirbúningsráð.
Aðalatriðið er að undirbúa sig fyrirfram. Prófaðu hversu vel þú manst reiknirit og gagnauppbyggingu og bættu þekkingu þína á sviðum sem þú þekkir ekki of vel. Það eru margir vettvangar á netinu sem geta hjálpað þér að undirbúa þig fyrir viðtöl. Við ráðleggjum geeksforgeeks, Barnavagn, Interviewing.io и CodeSignal.
Það er þess virði að læra að segja ákvörðunina upphátt. Það er ráðlegt að segja umsækjendum frá því sem þú gerir, en ekki bara skrifa á töfluna (eða slá kóða inn í tölvuna, líka hljóðlaust). Þannig, ef þú gerir mistök í kóðanum, en lausnin er almennt rétt, geturðu aukið líkurnar á árangri.
Þú þarft að skilja vandamálið áður en þú byrjar að leysa hann. Í sumum tilfellum gætirðu skilið verkefni yfirborðslega og farið síðan á rangan hátt. Það gæti verið þess virði að spyrja viðmælanda nokkurra skýringarspurninga.
Þú þarft að æfa þig í að skrifa kóða í höndunum, ekki á tölvu. Það kemur fyrir að í viðtölum er umsækjandi gefinn merkimiði og töflu þar sem engar vísbendingar eru eða sjálfvirkt snið. Þegar leitað er að lausn er það þess virði að skrifa niður kóðann þinn á blað eða beint á töfluna. Ef þú heldur öllu í hausnum gætirðu gleymt einhverju mikilvægu.
Sniðmátsverkefni í JavaScript
Sum þessara verkefna eru sennilega þegar kunnugleg þér. Þú hefur annað hvort átt viðtöl þar sem þú þurftir að leysa eitthvað svipað, eða æft þig á þeim á meðan þú lærðir JavaScript. Jæja, nú er kominn tími til að leysa þau aftur, og með nákvæmri útskýringu á ferlinu.
Palindrome
Palindrome er orð, setning eða röð stafa sem er lesin nákvæmlega eins bæði í venjulega átt og í gagnstæða átt. Til dæmis, "Anna" er palindrome, en "borð" og "John" eru það ekki.
Sviðsetning
Gefinn strengur; þú þarft að skrifa fall sem gerir þér kleift að skila satt ef strengurinn er palindrome, og false ef ekki. Í þessu tilviki þarftu að taka tillit til bila og greinarmerkja.
palindrome('kappakstursbíll') === satt
palindrome('tafla') === rangt
Við skulum greina verkefnið
Meginhugmyndin hér er að snúa strengnum við. Ef „öfugur“ strengurinn er alveg eins og sá upphaflega, þá höfum við fengið palindrome og fallið ætti að skila satt. Ef ekki, rangt.
ákvörðun
Hér er kóðinn sem leysir palindrome.
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('')
}
Fyrsta skrefið er að breyta stöfunum í inntaksstrengnum í lágstafi. Þetta er trygging fyrir því að forritið beri saman persónurnar sjálfar og ekki tilfelli eða neitt annað.
Annað skref er að snúa línunni við. Þetta er ekki erfitt að gera: þú þarft að breyta því í fylki með því að nota .split() aðferðina (String library). Síðan snúum við fylkinu við með því að nota .reverse() (Array library). Síðasta skrefið er að breyta öfugu fylki í streng með því að nota .join() (Array library).
Nú er allt sem þú þarft að gera er að bera saman „öfuga“ strenginn við upprunalega strenginn og skila niðurstöðunni sönn eða ósönn.
FizzBuzz
Eitt vinsælasta verkefnið í viðtölum.
Sviðsetning
Þú þarft að skrifa fall sem prentar tölur frá 1 til n á stjórnborðið, þar sem n er heil tala sem fallið tekur sem færibreytu, með eftirfarandi skilyrðum:
framleiðsla fizz í stað margfeldi af 3;
úttak suð í stað tölur sem eru margfeldi af 5;
fizzbuzz úttak í staðinn fyrir tölur sem eru margfeldi af bæði 3 og 5.
Dæmi
Fizzbuzz(5)
Niðurstaðan
// 1
// 2
// fús
// 4
//suð
Við skulum greina verkefnið
Aðalatriðið hér er leið til að finna margfeldi með JavaScript. Það er hægt að útfæra það með því að nota stuðulinn eða afganginn - %, sem gerir þér kleift að sýna afganginn þegar skipt er í tvær tölur. Ef afgangurinn er 0 þýðir það að fyrri talan er margfeldi hinnar.
12% 5 // 2 -> 12 er ekki margfeldi af 5
12% 3 // 0 -> 12 er margfeldi af 3
Þannig að ef þú deilir 12 með 5 færðu 2 með afganginum 2. Ef þú deilir 12 með 3 færðu 4 með afganginum 0. Í fyrra tilvikinu er 12 ekki margfeldi af 5, í því síðara , 12 er margfeldi af 3.
ákvörðun
Besta lausnin væri eftirfarandi kóða:
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ðgerðin framkvæmir nauðsynlegar athuganir með því að nota skilyrtar yfirlýsingar og framleiðir niðurstöðuna sem notandinn krefst. Í dæminu er rétt að gefa gaum að röðinni á if...else setningunum: Byrjaðu á tvöföldu skilyrði (&&) og endaðu á því tilviki þar sem margar tölur fundust ekki. Fyrir vikið náum við yfir alla valkosti.
Anagram
Þetta er nafn á orði sem inniheldur alla stafi annars orðs í sömu tölu, en í annarri röð.
Sviðsetning
Við þurfum að skrifa fall sem athugar hvort tveir strengir séu anagram og málið skiptir ekki máli. Aðeins stafir eru taldir; bil eða greinarmerki eru ekki tekin með í reikninginn.
anagram('finder', 'Friend') —> satt
anagram('halló', 'bless') —> rangt
Við skulum greina verkefnið
Það sem er mikilvægt að hafa í huga hér er að þú þarft að athuga hvern staf í innsláttarlínunum tveimur og númer þeirra í hverri línu.
Til að geyma anagram gögn, ættir þú að velja uppbyggingu eins og JavaScript hlut bókstaflega. Lykillinn í þessu tilfelli er eðli bréfsins, gildið er fjöldi endurtekningar hans í núverandi línu.
Það eru önnur skilyrði:
Gæta þarf þess að ekki sé tekið tillit til stafsetningar þegar borið er saman. Við breytum einfaldlega báðum strengjunum í lágstafi eða hástafi.
Við útilokum alla ekki stafi frá samanburðinum. Best að vinna með regluleg tjáning.
ákvörðun
// 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
}
Gefðu gaum að notkuninni Object.keys() í brotinu hér að ofan. Þessi aðferð skilar fylki sem inniheldur nöfn eða lykla í sömu röð og þeir birtast í hlutnum. Í þessu tilviki verður fylkið svona:
['f', 'i', 'n', 'd', 'e', 'r']
Þannig fáum við eiginleika hlutarins án þess að þurfa að gera bulk lykkju. Í vandamáli geturðu notað þessa aðferð með eiginleikanum .length til að athuga hvort báðir strengirnir séu með sama fjölda stafa - þetta er mikilvægur eiginleiki anagrams.
Leitaðu að sérhljóðum
Nokkuð einfalt verkefni sem kemur oft upp í viðtölum.
Sviðsetning
Þú þarft að skrifa fall sem tekur streng sem rök og skilar fjölda sérhljóða sem eru í strengnum.
Sérhljóðin eru „a“, „e“, „i“, „o“, „u“.
Mikilvægt er að huga að notkun .includes() aðferðarinnar. Það er fáanlegt fyrir bæði strengi og fylki. Það ætti að nota til að ákvarða hvort fylki inniheldur ákveðið gildi. Þessi aðferð skilar satt ef fylkið inniheldur tilgreint gildi og false ef það gerir það ekki.
Þetta notar .match() aðferðina, sem gerir þér kleift að útfæra skilvirka leit. Ef venjuleg segð sem aðferðarrök finnst innan tilgreinds strengs, þá er skilagildið fylki samsvarandi stafa. Jæja, ef það eru engar samsvörun, þá skilar .match() núll.
fibonacci
Klassískt verkefni sem er að finna í viðtölum á ýmsum stigum. Það er þess virði að minna á að Fibonacci röðin er röð talna þar sem hver á eftir er summan af tveimur fyrri. Svo, fyrstu tíu tölurnar líta svona út: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.
Sviðsetning
Þú þarft að skrifa fall sem skilar n. færslu í ákveðinni röð, þar sem n er talan sem er send sem rök til fallsins.
fibonacci(3) // —> 2
Þetta verkefni felur í sér að ganga í gegnum lykkju þann fjölda skipta sem tilgreindur er í röksemdafærslunni og skila gildinu á viðeigandi stað. Þessi leið til að setja fram vandamálið krefst þess að nota lykkjur. Ef þú notar endurtekningu í staðinn gæti það þóknast viðmælandanum og gefið þér nokkur aukastig.
ákvörðun
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]
}
Í niðurstöðufylkinu eru fyrstu tvær tölurnar í röðinni vegna þess að hver færsla í röðinni er summan af tveimur fyrri tölum. Strax í upphafi eru engar tvær tölur sem hægt er að taka til að fá næstu tölu, þannig að lykkjan getur ekki búið þær til sjálfkrafa. En eins og við vitum eru fyrstu tvær tölurnar alltaf 0 og 1. Þess vegna er hægt að frumstilla niðurstöður fylki handvirkt.
Hvað endurtekningar varðar, þá er allt einfaldara og flóknara á sama tíma:
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)
}
Við höldum áfram að kalla fibonacci() og sendum smærri og minni tölur sem rök. Við hættum þegar viðurkennd rök eru 0 eða 1.
Output
Líklegast hefur þú nú þegar lent í einhverju af þessum verkefnum ef þú hefur verið tekinn viðtal fyrir framenda- eða JavaScript þróunarstarf (sérstaklega ef það er á yngra stigi). En ef þú hefur ekki rekist á þá gætu þeir verið gagnlegir í framtíðinni - að minnsta kosti fyrir almenna þróun.