5 Oftaj JavaScript Intervjuaj Problemoj: Analizo kaj Solvoj

5 Oftaj JavaScript Intervjuaj Problemoj: Analizo kaj Solvoj

De la tradukinto: publikigis artikolon por vi Maria Antonietta Perna, kiu parolas pri tipaj JavaScript-taskoj, plej ofte ofertita al kandidatoj-programistoj ĉe intervjuoj. La artikolo estos utila, antaŭ ĉio, al komencaj programistoj.

Intervjuoj en teknologiaj kompanioj longe estas la parolado de la urbo. Ĉi tio ne estas surpriza - la sukcesa fino de la intervjuo ebligas akiri bonan laboron. Sed ĉi tio ne estas tiel facila, ĉar ofte necesas solvi kompleksajn problemojn.

Plie, plej ofte la plej multaj el ĉi tiuj taskoj ne rilatas al la laboro, kiun la kandidato plenumos, sed ili ankoraŭ devas esti solvitaj. Kelkfoje vi devas fari ĝin sur la tabulo, sen kontroli per Guglo aŭ iu ajn alia fonto. Jes, la situacio iom post iom ŝanĝiĝas, kaj en iuj kompanioj ili rifuzas tiajn intervjuojn, sed multaj dungantoj ankoraŭ aliĝas al ĉi tiu tradicio. Ĉi tiu artikolo estas dediĉita al la analizo de tipaj JavaScript-taskoj, kiuj ofte estas uzataj kiel taskoj por kandidatoj.

Ni memorigas vin: por ĉiuj legantoj de "Habr" - rabato de 10 000 rubloj kiam oni enskribas en iu ajn Skillbox-kurso per la reklamkodo "Habr".

Skillbox rekomendas: Praktika kurso "Poŝtelefona Programisto PRO".

La ĉefa afero estas zorge prepari vian intervjuon.

Jes, antaŭ ol ni komencas malkonstrui la taskojn, ni rigardu kelkajn ĝeneralajn konsiletojn por prepari intervjuon.

La ĉefa afero estas prepari anticipe. Kontrolu kiom bone vi memoras algoritmojn kaj datumstrukturojn, kaj plibonigu vian scion en areoj, kiujn vi ne tre konas. Estas multaj interretaj platformoj por helpi vin prepari por intervjuoj. Ni konsilas geeksforgeeks, Prampo, Intervjuante.io и Kodsignalo.

Indas lerni prononci la decidon laŭte. Estas konsilinde diri al kandidatoj, kion vi faras, kaj ne nur skribi sur la tabulo (aŭ tajpi kodon en la komputilo, ankaŭ silente). Tiel, se vi eraras en la kodo, sed la solvo ĝenerale ĝustas, vi povas pliigi viajn ŝancojn de sukceso.

La problemo devas esti komprenita antaŭ ol la solvo povas esti komencita. En iuj kazoj, vi povas supraĵe kompreni la taskon kaj poste iri laŭ la malĝusta vojo. Eble indas demandi kelkajn klarigantajn demandojn al la intervjuanto.

Vi devas ekzerci skribi kodon mane, ne en komputilo. Okazas, ke ĉe intervjuoj la kandidato ricevas markilon kaj tabulon, kie ne estas invitoj aŭ aŭtomata formatado. Serĉante solvon, skribu vian kodon sur papero aŭ ĝuste sur la tabulo. Se vi tenas ĉion en via kapo, vi povas forgesi ion gravan.

Ŝablonaj Taskoj en JavaScript

Vi verŝajne jam konas iujn ĉi tiujn taskojn. Vi aŭ faris intervjuojn kie vi devis solvi ion similan, aŭ ekzercis pri ili dum lernado de JavaScript. Nu, nun estas tempo por solvi ilin denove, kaj kun detala klarigo pri la procezo.

Palindromo

Palindromo estas vorto, frazo aŭ sinsekvo de signoj, kiu legas precize same kaj en la kutima direkto kaj en la kontraŭa direkto. Ekzemple, "Anna" estas palindromo, sed "tablo" kaj "Johano" ne estas.

Surscenigo

Donita ŝnuro; vi devas skribi funkcion, kiu ebligas al vi redoni vera se la ĉeno estas palindromo, kaj malvera alie. En ĉi tiu kazo, spacoj kaj interpunkciaj signoj devas esti konsiderataj.

palindromo ('vetkuro') === vera
palindromo('tabelo') === malvera

Analizante la taskon

La ĉefa ideo ĉi tie estas renversi la ŝnuron malantaŭen. Se la "inversa" ĉeno estas tute identa al la originala, tiam ni ricevis palindromon kaj la funkcio devus reveni vera. Se ne, malvera.

decido

Jen la kodo, kiu ebligas al vi solvi la palindromon.

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('')
}

La unua paŝo estas konverti la enigajn ĉenajn signojn al minusklo. Ĉi tio estas garantio, ke la programo komparos ĝuste la karakterojn mem, kaj ne uskle aŭ io alia.

La dua paŝo estas la inverso de la linio. Ĉi tio estas facila por fari: vi devas konverti ĝin al tabelo per la metodo .split() (String-biblioteko). Tiam ni inversigas la tabelon uzante .reverse() (Array-biblioteko). La lasta paŝo estas konverti la inversan tabelon al ĉeno uzante .join() (Array-biblioteko).

Nun necesas nur kompari la "inversan" ĉenon kun la originala, redonante la rezulton vera aŭ malvera.

fizzbuzz

Unu el la plej popularaj laboraj intervjuoj.

Surscenigo

Estas postulate skribi funkcion kiu montras nombrojn de 1 ĝis n al la konzolo, kie n estas entjero kiun la funkcio prenas kiel parametron, kun la sekvaj kondiĉoj:

  • eligo fizz anstataŭ multobloj de 3;
  • zuma eligo anstataŭ multobloj de 5;
  • fizzbuzz eligo anstataŭ multobloj de kaj 3 kaj 5.

Ekzemplo:

Fizzbuzz (5)

rezulto

// 1
// 2
// fizz
// 4
// zumado

Analizante la taskon

La ĉefa afero ĉi tie estas la maniero trovi multoblojn uzante JavaScript. Ĝi povas esti efektivigita uzante la modulan operatoron aŭ la reston -%, kiu ebligas al vi montri la reston kiam vi dividas du nombrojn. Se la resto estas 0, tio signifas, ke la unua nombro estas oblo de la dua.

12% 5 // 2 -> 12 ne estas oblo de 5
12% 3 // 0 -> 12 estas oblo de 3

Do, se ni dividas 12 per 5, ni ricevas 2 kun resto de 2. Se ni dividas 12 per 3, tiam ni ricevas 4 kun resto de 0. En la unua kazo, 12 ne estas oblo de 5, en la due, 12 estas oblo de 3.

decido

La plej bona solvo estus la sekva kodo:

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)
    }
  }
}

La funkcio faras la necesajn kontrolojn uzante kondiĉajn deklarojn kaj produktas la rezulton postulatan de la uzanto. En la tasko, indas atenti la ordon de la se... else deklaroj: komenci per duobla kondiĉo (&&) kaj finiĝi per la kazo kiam pluraj nombroj ne estis trovitaj. Kiel rezulto, ni kovras ĉiujn eblojn.

Anagramo

Tio estas la nomo de vorto, kiu enhavas ĉiujn literojn de alia vorto en la sama nombro, sed en malsama ordo.

Surscenigo

Ni devas skribi funkcion kiu kontrolas ĉu du ĉenoj estas anagramoj, kaj la kazo de literoj ne gravas. Nur signoj kalkulas; spacoj aŭ interpunkciaj signoj ne estas konsiderataj.

anagramo('trovinto', 'Amiko') --> vera
anagramo('saluton', 'ĝis revido') --> malvera

Analizante la taskon

Ĉi tie gravas konsideri, ke necesas kontroli ĉiun literon en du eniglinioj kaj ilian numeron en ĉiu linio.

trovilo -> f: 1 amiko -> f: 1
mi: 1 r: 1
n: 1 mi: 1
d: 1 e: 1
e: 1 n: 1
r:1 d:1

Por stoki anagramajn datumojn, vi devus elekti strukturon kiel JavaScript-objekto laŭvorta. La ŝlosilo en ĉi tiu kazo estas la karaktero de la litero, la valoro estas la nombro da ripetoj de ĝi en la nuna linio.

Estas ankaŭ aliaj kondiĉoj:

  • Vi devas certigi, ke la kazo de literoj ne estas konsiderata kiam oni komparas. Nur konverti ambaŭ kordojn al minuskla aŭ majuskla.
  • Ni ekskludas ĉiujn ne-karakterojn de la komparo. Plej bone kunlabori regulaj esprimoj.

decido

// 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
}

Atentu la uzon Object.keys() en la ĉi-supra fragmento. Ĉi tiu metodo resendas tabelon enhavantan la nomojn aŭ ŝlosilojn en la sama ordo kiel ili aperas en la objekto. En ĉi tiu kazo, la tabelo estos tia:

['f', 'i', 'n', 'd', 'e', ​​'r']

Tiel ni ricevas la ecojn de la objekto sen devi fari grandan buklon. En tasko, vi povas uzi ĉi tiun metodon kun la propraĵo .length - por kontroli ĉu ambaŭ ĉenoj havas la saman nombron da signoj - tio estas grava trajto de anagramoj.

Vokalserĉo

Sufiĉe simpla tasko, kiu ofte aperas en intervjuoj.

Surscenigo

Vi devas skribi funkcion kiu prenas ĉenon kiel argumenton kaj redonas la nombron da vokaloj kiujn la ĉeno enhavas.
La vokaloj estas "a", "e", "i", "o", "u".

Ekzemplo:

troviVokalojn('saluton') // --> 2
troviVokalojn('kial') // --> 0

decido

Jen la plej facila opcio:

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
}

Gravas atenti la uzon de la metodo .includes(). Ĝi estas disponebla por kaj ĉenoj kaj tabeloj. Ĝi devus esti uzata por ekscii ĉu tabelo enhavas certan valoron. Ĉi tiu metodo liveras vera se la tabelo enhavas la specifitan valoron kaj malvera alie.

Estas ankaŭ pli mallonga solvo al la problemo:

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

La metodo .match() estas uzata ĉi tie, kiu ebligas al vi efektivigi efikan serĉon. Se regula esprimo kiel metodo argumento troviĝas ene de la specifita ĉeno, tiam la revena valoro estas tabelo de kongruaj signoj. Nu, se ne estas kongruoj, tiam .match() redonas nulo.

Fibonacci

Klasika tasko kiu povas esti plenumita ĉe intervjuoj de diversaj niveloj. Indas memori, ke la vico de Fibonacci estas serio de nombroj, kie ĉiu posta estas la sumo de la antaŭaj du. Do, la unuaj dek nombroj aspektas jene: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Surscenigo

Vi devas skribi funkcion kiu resendas la n-an rekordon en certa sinsekvo, kaj n estas nombro kiu estas pasita kiel argumento al la funkcio.

Fibonacci(3) // --> 2

Ĉi tiu tasko implikas trapasi la nombron da fojoj specifita en la argumento, resendante la valoron ĉe la taŭga pozicio. Ĉi tiu maniero agordi la problemon postulas la uzon de bukloj. Se vi uzas rekursion anstataŭe, la intervjuanto eble ŝatos ĝin kaj donos al vi kelkajn kromajn poentojn.

decido

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]
}

En la rezulta tabelo, la unuaj du nombroj estas enhavitaj en vico ĉar ĉiu eniro en la sinsekvo konsistas el la sumo de la antaŭaj du nombroj. Ne estas du nombroj ĉe la komenco, kiuj povas esti prenitaj por ricevi la sekvan nombron, do la buklo ne povas generi ilin aŭtomate. Sed, kiel ni scias, la unuaj du nombroj estas ĉiam 0 kaj 1. Tial vi povas pravigi la rezultan tabelon permane.

Koncerne rekurson, ĉio estas pli simpla kaj pli komplika samtempe:

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)
}

Ni daŭre nomas fibonacci(), pasante en pli kaj pli malgrandaj nombroj kiel argumentoj. Ni ĉesas kiam la pasita argumento estas 0 aŭ 1.

konkludo

Plej verŝajne, vi jam alfrontis iun el ĉi tiuj taskoj se vi intervjuis por laboro kiel fasado aŭ JavaScript-programisto (precipe se ĝi estas juniora nivelo). Sed se vi ne renkontis ilin, ili eble estos utilaj estonte - almenaŭ por ĝenerala disvolviĝo.

Skillbox rekomendas:

fonto: www.habr.com

Aldoni komenton