5 tipinės JavaScript interviu užduotys: analizė ir sprendimai

5 tipinės JavaScript interviu užduotys: analizė ir sprendimai

Iš vertėjo: paskelbė jums straipsnį Maria Antonietta Perna, kuri pasakoja apie įprastas „JavaScript“ užduotis, dažniausiai siūlomi kūrėjų kandidatams pokalbių metu. Straipsnis bus naudingas, visų pirma, pradedantiesiems programuotojams.

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ą.

„Skillbox“ rekomenduoja: Praktinis kursas „Mobile Developer PRO“.

Svarbiausia yra kruopščiai pasiruošti pokalbiui.

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.

ieškiklis —> f: 1 draugas —> f: 1
aš: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r: 1 d: 1

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

sprendimas

Štai paprasčiausias variantas:

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
}

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.

Yra trumpesnis problemos sprendimas:

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

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.

„Skillbox“ rekomenduoja:

Šaltinis: www.habr.com

Добавить комментарий