Kazi 5 za kawaida za mahojiano ya JavaScript: uchambuzi na suluhisho

Kazi 5 za kawaida za mahojiano ya JavaScript: uchambuzi na suluhisho

Kutoka kwa mfasiri: alichapisha makala kwa ajili yako Maria Antonietta Perna, ambaye anazungumza kuhusu kazi za kawaida za JavaScript, mara nyingi hutolewa kwa waombaji wa wasanidi programu wakati wa mahojiano. Nakala hiyo itakuwa muhimu, kwanza kabisa, kwa waandaaji wa programu za novice.

Mahojiano katika makampuni ya teknolojia yamekuwa gumzo kwa muda mrefu. Hili halipaswi kustaajabisha— kufaulu mahojiano kwa mafanikio hukupa fursa ya kupata kazi nzuri. Lakini hii sio rahisi sana, kwani shida ngumu mara nyingi zinahitaji kutatuliwa.

Aidha, mara nyingi, kazi nyingi hizi hazihusiani na kazi ambayo mwombaji atafanya, lakini bado zinahitaji kutatuliwa. Wakati mwingine lazima uifanye kwenye ubao, bila kuangalia na Google au chanzo kingine chochote. Ndiyo, hali inabadilika hatua kwa hatua, na makampuni mengine yanaacha mahojiano hayo, lakini waajiri wengi bado wanazingatia mila hii. Nakala hii imejitolea kwa uchanganuzi wa kazi za kawaida za JavaScript ambazo mara nyingi hutumiwa kama kazi kwa wanaotafuta kazi.

Tunakukumbusha: kwa wasomaji wote wa "Habr" - punguzo la rubles 10 wakati wa kujiandikisha katika kozi yoyote ya Skillbox kwa kutumia msimbo wa uendelezaji wa "Habr".

Skillbox inapendekeza: Kozi ya vitendo "Pro ya Msanidi Programu wa Simu".

Jambo kuu ni kujiandaa kikamilifu kwa mahojiano yako.

Ndiyo, kabla ya kuanza kuangalia kazi, hebu tuangalie baadhi ya vidokezo vya maandalizi ya mahojiano ya jumla.

Jambo kuu ni kujiandaa mapema. Jaribu jinsi unavyokumbuka algoriti na miundo ya data, na uboresha maarifa yako katika maeneo ambayo huyafahamu sana. Kuna majukwaa mengi ya mtandaoni ambayo yanaweza kukusaidia kujiandaa kwa mahojiano. Tunashauri geeksforgeeks, Pramp, Interviewing.io и CodeSign.

Inafaa kujifunza kusema uamuzi kwa sauti kubwa. Inashauriwa kuwaambia waombaji kuhusu kile unachofanya, na si tu kuandika kwenye ubao (au chapa msimbo kwenye kompyuta, pia kimya). Kwa njia hii, ikiwa unafanya makosa katika kanuni, lakini suluhisho kwa ujumla ni sahihi, unaweza kuongeza nafasi zako za mafanikio.

Unahitaji kuelewa tatizo kabla ya kuanza kulitatua. Katika baadhi ya matukio, unaweza kuelewa kazi kijuujuu na kisha kwenda kwenye njia mbaya. Inaweza kufaa kuuliza maswali machache ya kufafanua kwa mhojiwaji.

Unahitaji kufanya mazoezi ya kuandika nambari kwa mkono, sio kwenye PC. Inatokea kwamba wakati wa mahojiano mwombaji anapewa alama na ubao mweupe, ambapo hakuna vidokezo au umbizo la kiotomatiki. Unapotafuta suluhu, inafaa kuandika msimbo wako kwenye kipande cha karatasi au moja kwa moja ubaoni. Ikiwa unaweka kila kitu katika kichwa chako, unaweza kusahau kitu muhimu.

Kazi za kiolezo katika JavaScript

Baadhi ya majukumu haya labda tayari unayafahamu. Labda umekuwa na mahojiano ambapo ilibidi usuluhishe kitu sawa, au ufanyie mazoezi wakati unajifunza JavaScript. Naam, sasa ni wakati wa kuzitatua tena, na kwa maelezo ya kina ya mchakato.

Palindrome

Palindrome ni neno, sentensi au mlolongo wa wahusika ambao husomwa sawa sawa katika mwelekeo wa kawaida na kinyume chake. Kwa mfano, "Anna" ni palindrome, lakini "meza" na "John" sio.

Staha

Kutokana na kamba; unahitaji kuandika kitendakazi ambacho hukuruhusu kurudi kweli ikiwa kamba ni palindrome, na sivyo ikiwa sivyo. Katika kesi hii, unahitaji kuzingatia nafasi na alama za punctuation.

palindrome('racecar') === kweli
palindrome('meza') === uongo

Hebu tuchambue kazi

Wazo kuu hapa ni kugeuza kamba. Ikiwa kamba ya "reverse" inafanana kabisa na ya awali, basi tumepokea palindrome na chaguo la kukokotoa linapaswa kurudi kweli. Ikiwa sivyo, uongo.

uamuzi

Hapa kuna nambari inayosuluhisha palindrome.

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

Hatua ya kwanza ni kubadilisha herufi kwenye mfuatano wa pembejeo kuwa herufi ndogo. Hii ni dhamana ya kwamba programu italinganisha wahusika wenyewe, na sio kesi au kitu kingine chochote.

Hatua ya pili ni kugeuza mstari. Hii si vigumu kufanya: unahitaji kuibadilisha kuwa safu kwa kutumia njia ya .split() (maktaba ya kamba). Kisha tunageuza safu kwa kutumia .reverse() (Array library). Hatua ya mwisho ni kubadilisha safu ya nyuma kuwa mfuatano kwa kutumia .join() (Array library).

Sasa unachohitaji kufanya ni kulinganisha mfuatano wa "reverse" na mfuatano wa asili, ukirudisha matokeo kuwa kweli au si kweli.

FizzBuzz

Moja ya kazi maarufu katika mahojiano.

Staha

Unahitaji kuandika kitendakazi ambacho huchapisha nambari kutoka 1 hadi n hadi koni, ambapo n ni nambari kamili ambayo kitendakazi huchukua kama kigezo, kwa masharti yafuatayo:

  • pato fizz badala ya mafungu ya 3;
  • pato buzz badala ya nambari ambazo ni nyingi za 5;
  • fizzbuzz pato badala ya nambari ambazo ni zidishi za 3 na 5.

Mfano

Fizzbuzz(5)

Matokeo

//1
//2
// fizi
//4
//buzz

Hebu tuchambue kazi

Jambo kuu hapa ni njia ya kupata anuwai kwa kutumia JavaScript. Inaweza kutekelezwa kwa kutumia operator wa modulus au salio -%, ambayo inakuwezesha kuonyesha salio wakati wa kugawanya nambari mbili. Ikiwa salio ni 0, inamaanisha kuwa nambari ya kwanza ni kizidishio cha pili.

12% 5 // 2 -> 12 sio kizidishio cha 5
12% 3 // 0 -> 12 ni nyingi ya 3

Kwa hivyo, ukigawanya 12 kwa 5, unapata 2 na salio ya 2. Ukigawanya 12 kwa 3, utapata 4 na salio ya 0. Katika kesi ya kwanza, 12 sio kizidisho cha 5, katika pili. , 12 ni kizidishio cha 3.

uamuzi

Suluhisho bora litakuwa nambari ifuatayo:

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

Kazi hufanya hundi muhimu kwa kutumia taarifa za masharti na hutoa matokeo yanayotakiwa na mtumiaji. Katika tatizo, inafaa kulipa kipaumbele kwa utaratibu wa ikiwa ... vinginevyo: anza na hali mbili (&&) na umalizie na kesi ambapo nambari nyingi hazikuweza kupatikana. Kama matokeo, tunashughulikia chaguzi zote.

Anagramu

Hili ni jina la neno ambalo lina herufi zote za neno lingine katika nambari sawa, lakini kwa mpangilio tofauti.

Staha

Unahitaji kuandika chaguo la kukokotoa ambalo hukagua ikiwa kamba mbili ni anagrams, na kesi haijalishi. Wahusika pekee ndio wanaohesabiwa; nafasi au alama za uakifishaji hazizingatiwi.

anagram('mpataji', 'Rafiki') -> kweli
anagram('hello', 'bye') -> uongo

Hebu tuchambue kazi

Jambo muhimu la kuzingatia hapa ni kwamba unahitaji kuangalia kila herufi katika mistari miwili ya pembejeo na nambari yao katika kila mstari.

mpataji —> f: 1 rafiki —> f: 1
i: 1 r: 1
n: 1: 1
d: 1 e: 1
e: 1 n: 1
r: 1 d: 1

Ili kuhifadhi data ya anagram, unapaswa kuchagua muundo kama vile kitu halisi cha JavaScript. Muhimu katika kesi hii ni tabia ya barua, thamani ni idadi ya marudio yake katika mstari wa sasa.

Kuna masharti mengine:

  • Unahitaji kuhakikisha kuwa kesi ya barua haijazingatiwa wakati wa kulinganisha. Tunabadilisha tu mifuatano yote miwili kuwa herufi ndogo au kubwa.
  • Tunawatenga wote wasio wahusika kutoka kwa kulinganisha. Bora kufanya kazi na maneno ya kawaida.

uamuzi

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

Makini na matumizi Kitu.funguo() katika kijisehemu hapo juu. Njia hii hurejesha safu iliyo na majina au funguo kwa mpangilio sawa na zinavyoonekana kwenye kitu. Katika kesi hii, safu itakuwa kama hii:

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

Kwa njia hii tunapata mali ya kitu bila kufanya kitanzi kikubwa. Katika tatizo, unaweza kutumia njia hii na kipengele cha .length ili kuangalia kama masharti yote yana idadi sawa ya wahusika - hii ni kipengele muhimu cha anagrams.

Tafuta vokali

Kazi rahisi ambayo mara nyingi huja kwenye mahojiano.

Staha

Unahitaji kuandika kitendakazi ambacho huchukua mfuatano kama hoja na kurudisha idadi ya vokali zilizomo kwenye mfuatano huo.
Vokali ni “a”, “e”, “i”, “o”, “u”.

Mfano:

find Vokali('hello') // —> 2
find Vokali('kwanini') // —> 0

uamuzi

Hapa kuna chaguo rahisi zaidi:

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
}

Ni muhimu kuzingatia matumizi ya njia ya .includes(). Inapatikana kwa nyuzi na safu zote. Inapaswa kutumiwa kubainisha ikiwa safu ina thamani fulani. Njia hii hurejesha kweli ikiwa safu ina thamani iliyobainishwa, na sivyo ikiwa haina.

Kuna suluhisho fupi kwa shida:

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

Hii hutumia mbinu ya .match(), ambayo hukuruhusu kutekeleza utafutaji unaofaa. Ikiwa usemi wa kawaida kama hoja ya mbinu unapatikana ndani ya mfuatano uliobainishwa, basi thamani ya kurudi ni safu ya herufi zinazolingana. Naam, ikiwa hakuna zinazolingana, basi .match() itarejesha null.

fibonacci

Kazi ya kawaida ambayo inaweza kupatikana katika mahojiano katika viwango mbalimbali. Inafaa kukumbuka kuwa mlolongo wa Fibonacci ni safu ya nambari ambapo kila inayofuata ni jumla ya mbili zilizopita. Kwa hivyo, nambari kumi za kwanza zinaonekana kama hii: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Staha

Unahitaji kuandika chaguo za kukokotoa ambazo hurejesha rekodi ya nth katika mlolongo fulani, na n kuwa nambari inayopitishwa kama hoja kwa chaguo la kukokotoa.

fibonacci(3) // —> 2

Jukumu hili linahusisha kutembea kupitia kitanzi idadi ya nyakati zilizobainishwa kwenye hoja, kurudisha thamani katika nafasi inayofaa. Njia hii ya kuibua shida inahitaji matumizi ya vitanzi. Ikiwa unatumia kujirudia badala yake, inaweza kumfurahisha anayehoji na kukupa pointi chache za ziada.

uamuzi

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

Katika safu ya matokeo, nambari mbili za kwanza zimo kwenye safu kwa sababu kila ingizo katika mlolongo ni jumla ya nambari mbili zilizopita. Mwanzoni kabisa hakuna nambari mbili ambazo zinaweza kuchukuliwa kupata nambari inayofuata, kwa hivyo kitanzi hakiwezi kuwazalisha kiatomati. Lakini, kama tunavyojua, nambari mbili za kwanza daima ni 0 na 1. Kwa hivyo, unaweza kuanzisha safu ya matokeo kwa mikono.

Kama ilivyo kwa kujirudia, kila kitu ni rahisi na ngumu zaidi kwa wakati mmoja:

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

Tunaendelea kupiga simu fibonacci(), tukipitisha nambari ndogo na ndogo kama hoja. Tunasimama wakati hoja iliyopitishwa ni 0 au 1.

Pato

Uwezekano mkubwa zaidi, tayari umekutana na mojawapo ya kazi hizi ikiwa umehojiwa kwa ajili ya kazi ya mbele au ya msanidi wa JavaScript (hasa ikiwa iko katika kiwango cha chini). Lakini ikiwa haujakutana nazo, zinaweza kuwa muhimu katika siku zijazo - angalau kwa maendeleo ya jumla.

Skillbox inapendekeza:

Chanzo: mapenzi.com

Kuongeza maoni