Pokalbiai technologijų įmonėse jau seniai buvo miesto kalba. Tai neturėtų stebinti – sėkmingas pokalbio išlaikymas suteikia galimybę gauti gerą darbą. Tačiau tai nėra taip paprasta, nes dažnai reikia išspręsti sudėtingas problemas.
Be to, dažniausiai dauguma šių užduočių nėra susijusios su darbu, kurį atliks pareiškėjas, tačiau jas vis tiek reikia išspręsti. Kartais jūs turite tai padaryti lentoje, nepasitikrindami „Google“ ar kito šaltinio. Taip, situacija pamažu keičiasi, kai kurios įmonės atsisako tokių pokalbių, tačiau daugelis darbdavių šios tradicijos vis dar laikosi. Šis straipsnis skirtas tipinių „JavaScript“ užduočių, kurios dažnai naudojamos kaip darbo ieškančių asmenų užduotys, analizei.
Primename:visiems „Habr“ skaitytojams – 10 000 rublių nuolaida užsiregistravus į bet kurį „Skillbox“ kursą naudojant „Habr“ reklamos kodą.
Taip, prieš pradėdami nagrinėti užduotis, pažvelkime į keletą bendrų pasiruošimo pokalbiui patarimų.
Svarbiausia yra pasiruošti iš anksto. Išbandykite, kaip gerai atsimenate algoritmus ir duomenų struktūras, ir patobulinkite savo žinias tose srityse, kurių nesate per daug susipažinę. Yra daug internetinių platformų, kurios gali padėti pasiruošti pokalbiui. Mes patariame geeksforgeeks, Pramp, Interviu.io и „CodeSignal“.
Verta išmokti garsiai pasakyti sprendimą. Patartina kandidatams papasakoti apie tai, ką darote, o ne tik rašyti lentoje (arba įvesti kodą į kompiuterį, taip pat tyliai). Tokiu būdu, jei padarysite klaidą kode, bet sprendimas apskritai yra teisingas, galite padidinti savo sėkmės tikimybę.
Prieš pradėdami ją spręsti, turite suprasti problemą. Kai kuriais atvejais galite suprasti užduotį paviršutiniškai ir nueiti klaidingu keliu. Galbūt vertėtų pašnekovui užduoti keletą paaiškinančių klausimų.
Turite praktikuoti kodo rašymą ranka, o ne kompiuteriu. Pasitaiko, kad pokalbių metu pretendentui įteikiamas žymeklis ir lenta, kur nėra jokių užuominų ar automatinio formatavimo. Ieškant sprendimo verta užsirašyti savo kodą ant popieriaus lapo arba tiesiai ant lentos. Jei viską laikysite savo galvoje, galite pamiršti ką nors svarbaus.
Šablono užduotys JavaScript
Kai kurios iš šių užduočių tikriausiai jau žinomos. Jūs arba turėjote interviu, kai turėjote išspręsti kažką panašaus, arba praktikavote juos mokydamiesi JavaScript. Na, dabar atėjo laikas vėl juos išspręsti ir išsamiai paaiškinti procesą.
Palindromas
Palindromas – tai žodis, sakinys ar simbolių seka, kuri skaitoma lygiai taip pat ir įprasta, ir priešinga kryptimi. Pavyzdžiui, "Anna" yra palindromas, bet "stalas" ir "Jonas" nėra.
Scenografija
Duota eilutė; reikia parašyti funkciją, kuri leistų grąžinti „true“, jei eilutė yra palindromas, ir „false“, jei ne. Tokiu atveju reikia atsižvelgti į tarpus ir skyrybos ženklus.
palindromas('lenktyninis automobilis') === tiesa
palindromas('lentelė') === false
Išanalizuokime užduotį
Pagrindinė mintis čia yra pakeisti eilutę. Jei „atvirkštinė“ eilutė yra visiškai identiška pradinei, tada gavome palindromą ir funkcija turėtų grąžinti „true“. Jei ne, klaidinga.
sprendimas
Čia yra kodas, kuris išsprendžia palindromą.
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('')
}
Pirmas žingsnis yra konvertuoti įvesties eilutės simbolius į mažąsias raides. Tai garantija, kad programa lygins pačius simbolius, o ne raides ar dar ką nors.
Antrasis žingsnis yra pakeisti liniją. Tai padaryti nėra sunku: jį reikia konvertuoti į masyvą naudojant .split() metodą (String library). Tada apverčiame masyvą naudodami .reverse() (masyvo biblioteka). Paskutinis veiksmas yra konvertuoti atvirkštinį masyvą į eilutę naudojant .join() (masyvo biblioteką).
Dabar tereikia palyginti „atvirkštinę“ eilutę su pradine eilute, grąžinant rezultatą teisinga arba klaidinga.
FizzBuzz
Viena populiariausių užduočių interviu metu.
Scenografija
Turite parašyti funkciją, kuri spausdina skaičius nuo 1 iki n į konsolę, kur n yra sveikasis skaičius, kurį funkcija laiko parametru, su šiomis sąlygomis:
išvesties fizz vietoj 3 kartotinių;
vietoje skaičių, kurie yra 5 kartotiniai, išvesties garsas;
fizzbuzz išvestis vietoj skaičių, kurie yra 3 ir 5 kartotiniai.
Pavyzdys
Fizzbuzz (5)
Rezultatas
// 1 m
// 2 m
// fizz
// 4 m
//buzz
Išanalizuokime užduotį
Svarbiausia čia yra būdas rasti kartotinius naudojant „JavaScript“. Jį galima įgyvendinti naudojant modulio operatorių arba likutį – %, leidžiantį parodyti likutį dalijant du skaičius. Jei liekana yra 0, tai reiškia, kad pirmasis skaičius yra antrojo kartotinis.
12% 5 // 2 -> 12 nėra 5 kartotinis
12% 3 // 0 -> 12 yra 3 kartotinis
Taigi, jei padalinsite 12 iš 5, gausite 2 su 2 likučiu. Jei 12 padalysite iš 3, gausite 4, o liekana yra 0. Pirmuoju atveju 12 nėra 5 kartotinis, antruoju , 12 yra 3 kartotinis.
sprendimas
Optimalus sprendimas būtų toks kodas:
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)
}
}
}
Funkcija atlieka reikiamus patikrinimus naudodama sąlyginius sakinius ir pateikia vartotojo reikalingą rezultatą. Užduotyje verta atkreipti dėmesį į if...else teiginių eiliškumą: pradėti dviguba sąlyga (&&) ir baigti tuo atveju, kai nepavyko rasti kelių skaičių. Dėl to mes apimame visas galimybes.
Anagrama
Tai yra žodžio pavadinimas, kuriame yra visos kito žodžio raidės tuo pačiu skaičiumi, bet skirtinga tvarka.
Scenografija
Turime parašyti funkciją, kuri patikrintų, ar dvi eilutės yra anagramos, o didžiosios ir mažosios raidės neturi reikšmės. Skaičiuojami tik simboliai; į tarpus ar skyrybos ženklus neatsižvelgiama.
anagrama ('ieškotojas', 'Draugas') —> tiesa
anagrama ('labas', 'atsisveik') —> klaidinga
Išanalizuokime užduotį
Svarbu atsižvelgti į tai, kad reikia patikrinti kiekvieną raidę dviejose įvesties eilutėse ir jų skaičių kiekvienoje eilutėje.
Norėdami saugoti anagramos duomenis, turėtumėte pasirinkti struktūrą, pvz., JavaScript objekto literalą. Raktas šiuo atveju yra raidės simbolis, reikšmė yra jos pasikartojimų skaičius dabartinėje eilutėje.
Yra ir kitų sąlygų:
Turite įsitikinti, kad lyginant neatsižvelgiama į raidžių dydį. Mes tiesiog konvertuojame abi eilutes į mažąsias arba didžiąsias raides.
Iš palyginimo neįtraukiame visų ne simbolių. Geriausia dirbti su reguliarios išraiškos.
sprendimas
// 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
}
Atkreipkite dėmesį į naudojimą Object.keys() aukščiau esančiame fragmente. Šis metodas grąžina masyvą, kuriame yra vardai arba raktai ta pačia tvarka, kokia jie rodomi objekte. Šiuo atveju masyvas bus toks:
["f", "i", "n", "d", "e", "r"]
Tokiu būdu mes gauname objekto savybes nedarant masinio ciklo. Esant problemai, galite naudoti šį metodą su .length savybe, kad patikrintumėte, ar abi eilutės turi tiek pat simbolių – tai svarbi anagramų savybė.
Ieškokite balsių
Gana paprasta užduotis, kuri dažnai iškyla interviu metu.
Scenografija
Turite parašyti funkciją, kuri paima eilutę kaip argumentą ir grąžina eilutėje esančių balsių skaičių.
Balsės yra „a“, „e“, „i“, „o“, „u“.
Pavyzdys:
rasti balsių('labas') // —> 2
rasti balsių('kodėl') // —> 0
Svarbu atkreipti dėmesį į .includes() metodo naudojimą. Jis prieinamas tiek eilutėms, tiek masyvams. Jis turėtų būti naudojamas norint nustatyti, ar masyve yra tam tikra reikšmė. Šis metodas grąžina „true“, jei masyve yra nurodyta reikšmė, ir „false“, jei jos nėra.
Tam naudojamas .match() metodas, leidžiantis įgyvendinti efektyvią paiešką. Jei reguliarioji išraiška kaip metodo argumentas yra nurodytoje eilutėje, grąžinama reikšmė yra atitinkančių simbolių masyvas. Na, jei atitikmenų nėra, tada .match() grąžina nulį.
Fibonačio
Klasikinė užduotis, kurią galima rasti įvairių lygių interviu. Verta prisiminti, kad Fibonačio seka yra skaičių serija, kur kiekviena paskesnė yra ankstesnių dviejų suma. Taigi, pirmieji dešimt skaičių atrodo taip: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.
Scenografija
Turite parašyti funkciją, kuri grąžina n-ąjį įrašą tam tikra seka, o n yra skaičius, kuris perduodamas kaip funkcijos argumentas.
fibonačio (3) // —> 2
Ši užduotis apima ėjimą per kilpą tiek kartų, kiek nurodyta argumente, grąžinant reikšmę atitinkamoje vietoje. Šis problemos iškėlimo būdas reikalauja naudoti kilpas. Jei vietoj to naudosite rekursiją, tai gali patikti pašnekovui ir suteikti jums keletą papildomų taškų.
sprendimas
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]
}
Rezultatų masyve pirmieji du skaičiai yra serijoje, nes kiekvienas sekos įrašas yra ankstesnių dviejų skaičių suma. Pačioje pradžioje nėra dviejų skaičių, iš kurių galima gauti kitą skaičių, todėl ciklas negali jų generuoti automatiškai. Tačiau, kaip žinome, pirmieji du skaičiai visada yra 0 ir 1. Todėl rezultatų masyvą galite inicijuoti rankiniu būdu.
Kalbant apie rekursiją, viskas yra paprastesnė ir sudėtingesnė tuo pačiu metu:
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)
}
Mes nuolat vadiname fibonacci(), kaip argumentus perduodame vis mažesnius skaičius. Sustabdome, kai priimtas argumentas yra 0 arba 1.
Produkcija
Greičiausiai jau susidūrėte su bet kuria iš šių užduočių, jei buvote apklaustas dėl frontend arba JavaScript kūrėjo darbo (ypač jei tai yra jaunesniojo lygio). Bet jei su jais nesusidūrėte, jie gali būti naudingi ateityje – bent jau bendram vystymuisi.