5 JavaScript ohiko elkarrizketa-arazoak: analisia eta irtenbideak

5 JavaScript ohiko elkarrizketa-arazoak: analisia eta irtenbideak

Itzultzailearen eskutik: artikulu bat argitaratu zuen zuretzat Maria Antonietta Perna, JavaScript zeregin tipikoei buruz hitz egiten duena, gehienetan eskatzaile-garatzaileei eskaintzen zaie elkarrizketetan. Artikulua erabilgarria izango da, lehenik eta behin, programatzaile hasiberrientzat.

Enpresa teknologikoetan egindako elkarrizketak aspalditik dira hizpide herrian. Hau ez da harritzekoa - elkarrizketa arrakastaz amaitzeak lan ona lortzea ahalbidetzen du. Baina hau ez da hain erraza, askotan arazo konplexuak konpontzea beharrezkoa delako.

Gainera, gehienetan zeregin horietako gehienak ez daude eskatzaileak egingo duen lanarekin zerikusirik, baina oraindik konpondu behar dira. Batzuetan arbelean egin behar duzu, Google-rekin edo beste edozein iturrirekin egiaztatu gabe. Bai, pixkanaka egoera aldatzen ari da, eta enpresa batzuetan uko egiten diete horrelako elkarrizketei, baina enpresaburu askok tradizio horri atxikitzen diote oraindik. Artikulu hau eskatzaileentzako zeregin gisa erabili ohi diren JavaScript zeregin tipikoen azterketara zuzenduta dago.

Gogoratzen dugu: "Habr" irakurle guztientzat - 10 errubloko deskontua "Habr" promozio-kodea erabiliz Skillbox-eko edozein ikastarotan izena ematean.

Skillbox-ek gomendatzen du: Ikastaro praktikoa "Mobile Developer PRO".

Gauza nagusia zure elkarrizketa arretaz prestatzea da.

Bai, zereginak banatzen hasi baino lehen, ikus ditzagun elkarrizketa bat prestatzeko aholku orokor batzuk.

Gauza nagusia aldez aurretik prestatzea da. Egiaztatu algoritmoak eta datu-egiturak zein ondo gogoratzen dituzun, eta hobetu zure ezagutzak oso ezagutzen ez dituzun arloetan. Sareko plataforma asko daude elkarrizketak prestatzen laguntzeko. Aholkatzen dugu geeksforgeeks, Pramp, Elkarrizketa egiten.io и KodeSeinalea.

Merezi du erabakia ozen ahoskatzen ikastea. Komeni da eskatzaileei zer egiten ari zareten esatea, eta ez arbelean idaztea soilik (edo ordenagailuan kodea idatzi, isilik ere). Horrela, kodean akatsen bat egiten baduzu, baina soluzioa orokorrean zuzena bada, arrakasta izateko aukerak handitu ditzakezu.

Arazoa ulertu behar da konponbidea hasi aurretik. Zenbait kasutan, azaletik uler dezakezu zeregina eta gero bide okerra joan. Baliteke elkarrizketatzaileari galdera argigarri batzuk egitea.

Kodea eskuz idazten landu behar duzu, ez ordenagailuan. Gertatzen da elkarrizketetan eskatzaileari markatzaile bat eta arbel bat ematen zaizkiola, non galdeketarik edo formatu automatikorik ez dagoen. Irtenbide bat bilatzean, idatzi zure kodea paper batean edo arbelean. Dena buruan gordetzen baduzu, zerbait garrantzitsua ahaztu dezakezu.

Txantiloiaren atazak JavaScript-en

Ziurrenik dagoeneko ezagutzen dituzu zeregin horietako batzuk. Antzeko zerbait ebatzi behar zenuten elkarrizketak egin dituzu, edo haiekin praktikatu duzu JavaScript ikasten ari zaren bitartean. Bada, orain berriro konpontzeko garaia da, eta prozesuaren azalpen zehatzarekin.

Palindromoa

Palindromoa ohiko noranzkoan zein kontrako noranzkoan berdin irakurtzen den hitz, esaldi edo karaktere-segida bat da. Adibidez, "Anna" palindromo bat da, baina "taula" eta "John" ez.

produkzio

Kate bat emanda; katea palindromoa bada, egia itzultzeko aukera ematen duen funtzio bat idatzi behar duzu, eta faltsua bestela. Kasu honetan, tarteak eta puntuazio-zeinuak hartu behar dira kontuan.

palindromo('lasterketa-autoa') === egia
palindromo('taula') === faltsua

Zereginaren azterketa

Hemen ideia nagusia katea atzerantz iraultzea da. "Alderantzizko" katea jatorrizkoaren guztiz berdina bada, orduan palindromo bat lortu dugu eta funtzioak egia itzuli beharko luke. Hala ez bada, gezurra.

Erabaki

Hona hemen palindromoa konpontzeko aukera ematen duen kodea.

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

Lehenengo urratsa sarrerako kate karaktereak minuskula bihurtzea da. Hau bermea da programak pertsonaiak beraiek alderatuko dituela, eta ez kasuak edo beste zerbait.

Bigarren urratsa lerroaren alderantzizkoa da. Erraza da hau: array bihurtu behar duzu .split() metodoa erabiliz (String liburutegia). Ondoren, matrizea alderantzikatuko dugu .reverse() erabiliz (Array liburutegia). Azken urratsa alderantzizko matrizea kate bihurtzea da .join() erabiliz (Array liburutegia).

Orain behar dena da "alderantzizko" katea jatorrizkoarekin alderatzea, emaitza egia ala gezurra itzuliz.

bizkorra

Lan-elkarrizketa ezagunenetako bat.

produkzio

1etik n arteko zenbakiak bistaratzen dituen funtzio bat idatzi behar da kontsolan, non n funtzioak parametro gisa hartzen duen zenbaki oso bat den, baldintza hauekin:

  • irteera fizz 3ren multiploen ordez;
  • buzz irteera 5en multiploen ordez;
  • fizzbuzz irteera 3 eta 5en multiploen ordez.

Adibidea

Fizzbuzz (5)

Emaitza

// 1
// 2
// fizz
// 4
// burrunba

Zereginaren azterketa

Hemen gauza nagusia JavaScript erabiliz multiploak aurkitzeko modua da. Modulu operadorea edo hondarra -% erabiliz inplementa daiteke, bi zenbaki zatitzean hondarra erakusteko aukera ematen duena. Hondarra 0 bada, lehen zenbakia bigarrenaren multiploa dela esan nahi du.

% 12 5 // 2 -> 12 ez da 5en multiploa
% 12 3 // 0 -> 12 3ren multiploa da

Beraz, 12z 5 zatitzen badugu, 2 lortuko dugu 2 hondarrarekin. 12 3z zatitzen badugu, orduan 4 lortuko dugu 0 hondarrarekin. Lehenengo kasuan, 12 ez da 5en multiploa, bigarrenik, 12 3ren multiploa da.

Erabaki

Irtenbide onena honako kodea izango litzateke:

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

Funtzioak beharrezko egiaztapenak egiten ditu baldintzazko adierazpenak erabiliz eta erabiltzaileak eskatzen duen emaitza sortzen du. Zereginean, komeni da if...else enuntziatuen ordenari erreparatzea: baldintza bikoitz batekin hasi (&&) eta zenbaki anitz aurkitu ezin diren kasuarekin amaitzen da. Ondorioz, aukera guztiak estaltzen ditugu.

Anagrama

Hau da, beste hitz baten letra guztiak zenbaki berean, baina beste ordena batean dituen hitz baten izena.

produkzio

Bi kate anagramak diren egiaztatzen duen funtzio bat idatzi behar dugu, eta letren maiuskulak ez du axola. Karaktereak bakarrik balio du; espazioak edo puntuazio-ikurrak ez dira kontuan hartzen.

anagrama('biltzailea', 'Laguna') --> egia
anagrama('kaixo', 'agur') --> faltsua

Zereginaren azterketa

Hemen garrantzitsua da kontuan hartu behar dela hizki bakoitza bi sarrera-lerrotan eta haien zenbakia lerro bakoitzean egiaztatu behar dela.

bilatzailea -> f: 1 lagun -> f: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r:1 d:1

Anagrama datuak gordetzeko, egitura bat aukeratu beharko zenuke, esate baterako, JavaScript objektu literala. Kasu honetan gakoa letraren karakterea da, balioa uneko lerroan horren errepikapen kopurua da.

Beste baldintza batzuk ere badaude:

  • Konparatzerakoan letren kasua ez dela kontuan hartzen ziurtatu behar duzu. Bihurtu bi kateak minuskula edo larriz.
  • Konparaziotik kanpoko pertsonaia guztiak baztertzen ditugu. Hoberekin lan egitea esamolde erregularrak.

Erabaki

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

Erreparatu erabilerari Object.keys() goiko zatian. Metodo honek izenak edo gakoak dituen array bat itzultzen du objektuan agertzen diren ordena berean. Kasu honetan, array-a honelakoa izango da:

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

Horrela objektuaren propietateak lortuko ditugu begizta handi bat egin beharrik gabe. Zeregin batean, metodo hau erabil dezakezu .length propietatearekin - bi kateek karaktere kopuru bera duten egiaztatzeko - hau anagramen ezaugarri garrantzitsu bat da.

Bokal bilaketa

Nahiko zeregin sinplea, elkarrizketetan askotan agertzen dena.

produkzio

Kate bat argumentu gisa hartzen duen eta kateak dituen bokal kopurua itzultzen duen funtzio bat idatzi behar duzu.
Bokalak "a", "e", "i", "o", "u" dira.

Adibidea:

aurkitu bokalak('kaixo') // --> 2
aurkitu bokalak('zergatik') // --> 0

Erabaki

Hona hemen aukerarik errazena:

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
}

Garrantzitsua da .includes() metodoaren erabileran arreta jartzea. Kate eta arrayetarako eskuragarri dago. Array batek balio jakin bat duen jakiteko erabili behar da. Metodo honek true itzultzen du matrizeak zehaztutako balioa badu eta false bestela.

Arazoari irtenbide laburragoa ere badago:

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

.match() metodoa erabiltzen da hemen, bilaketa eraginkorra ezartzeko aukera ematen duena. Adierazpen erregular bat metodo argumentu gisa zehaztutako katearen barruan aurkitzen bada, orduan itzulera balioa bat datozen karaktereen array bat da. Beno, parekorik ez badago, .match()-k nulua ematen du.

Fibonacci

Hainbat mailatako elkarrizketetan bete daitekeen zeregin klasikoa. Fibonacciren segida zenbakien serie bat dela gogoratzea komeni da, non ondorengo bakoitza aurreko bien batura den. Beraz, lehenengo hamar zenbakiak honelakoak dira: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

produkzio

ngarren erregistroa sekuentzia jakin batean itzultzen duen funtzio bat idatzi behar duzu, eta n funtzioari argumentu gisa pasatzen zaion zenbakia da.

fibonacci(3) // --> 2

Zeregin honek argumentuan zehaztutako aldiz errepikatzea dakar, balioa dagokion posizioan itzuliz. Arazoa ezartzeko modu honek begiztak erabiltzea eskatzen du. Errekurtsioa erabiltzen baduzu, elkarrizketatzaileari gustatuko zaio eta puntu gehigarri batzuk emango dizkizu.

Erabaki

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

Emaitza-matrizean, lehenengo bi zenbakiak errenkadan daude, segidako sarrera bakoitza aurreko bi zenbakien baturak osatzen baitu. Hasieran ez daude hurrengo zenbakia lortzeko hartu daitezkeen bi zenbaki, beraz, begiztak ezin ditu automatikoki sortu. Baina, dakigunez, lehenengo bi zenbakiak 0 eta 1 dira beti. Horregatik, emaitza-matrizea eskuz has dezakezu.

Errekurtsioari dagokionez, dena sinpleagoa eta konplikatuagoa da aldi berean:

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

Fibonacci(ri) deitzen jarraitzen dugu, gero eta zenbaki txikiagoak argumentu gisa pasatuz. Pasatutako argumentua 0 edo 1 denean gelditzen gara.

Irteera

Seguruenik, zeregin horietakoren bat aurrez aurre izan duzu frontend edo JavaScript garatzaile gisa lan baterako elkarrizketak egiten ari bazara (batez ere junior maila bada). Baina horiek topatzen ez badituzu, etorkizunean baliagarriak izan daitezke, garapen orokorrerako behintzat.

Skillbox-ek gomendatzen du:

Iturria: www.habr.com

Gehitu iruzkin berria