5 yleistä JavaScript-haastatteluongelmaa: analyysi ja ratkaisut

5 yleistä JavaScript-haastatteluongelmaa: analyysi ja ratkaisut

Kääntäjältä: julkaisi artikkelin sinulle Maria Antonietta Perna, joka puhuu tyypillisistä JavaScript-tehtävistä, jota useimmiten tarjotaan hakijoille-kehittäjille haastatteluissa. Artikkeli on hyödyllinen ennen kaikkea aloitteleville ohjelmoijille.

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.

Skillbox suosittelee: Käytännön kurssi "Mobile Developer PRO".

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.

palindromi('kilpa-auto') === totta
palindromi('taulukko') === false

Tehtävän jäsentäminen

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.

Esimerkki

Fizzbuzz(5)

Tulos

// 1 XNUMX
// 2 XNUMX
// kuohua
// 4 XNUMX
// surina

Tehtävän jäsentäminen

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.

anagrammi ('löytäjä', 'ystävä') --> totta
anagrammi ('hei', 'hei') --> false

Tehtävän jäsentäminen

Tässä on tärkeää ottaa huomioon, että on tarpeen tarkistaa jokainen kirjain kahdella syöttörivillä ja niiden numero kullakin rivillä.

Finder -> f: 1 ystävä -> f: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r:1 d:1

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

Esimerkiksi:

findVowels('hello') // --> 2
findVowels('why') // --> 0

päätös

Tässä on helpoin vaihtoehto:

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
}

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.

Ongelmaan on myös lyhyempi ratkaisu:

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

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.

Skillbox suosittelee:

Lähde: will.com

Lisää kommentti