5 tipiski JavaScript intervijas uzdevumi: analīze un risinājumi

5 tipiski JavaScript intervijas uzdevumi: analīze un risinājumi

No tulka: publicēja jums rakstu Maria Antonietta Perna, kura stāsta par izplatītākajiem JavaScript uzdevumiem, visbiežāk tiek piedāvāts izstrādātāju pretendentiem interviju laikā. Raksts būs noderīgs, pirmkārt, iesācējiem programmētājiem.

Intervijas tehnoloÄ£iju uzņēmumos jau sen ir bijuÅ”as pilsētas runas. Tam nevajadzētu bÅ«t pārsteidzoÅ”am ā€“ sekmÄ«ga intervijas nokārtoÅ”ana sniedz iespēju iegÅ«t labu darbu. Bet tas nav tik vienkārÅ”i, jo bieži vien ir jāatrisina sarežģītas problēmas.

Turklāt visbiežāk lielākā daļa Å”o uzdevumu nav saistÄ«ti ar darbu, ko pretendents veiks, bet tie joprojām ir jāatrisina. Dažreiz jums tas jādara uz tāfeles, nepārbaudot Google vai kādu citu avotu. Jā, situācija pamazām mainās, un daži uzņēmumi atsakās no Ŕādām intervijām, taču daudzi darba devēji joprojām pieturas pie Ŕīs tradÄ«cijas. Å is raksts ir veltÄ«ts tipisku JavaScript uzdevumu analÄ«zei, kas bieži tiek izmantoti kā uzdevumi darba meklētājiem.

Atgādinām: visiem "Habr" lasītājiem - atlaide 10 000 rubļu, reģistrējoties jebkurā Skillbox kursā, izmantojot "Habr" reklāmas kodu.

Skillbox iesaka: Praktiskais kurss "Mobile Developer PRO".

Galvenais ir rūpīgi sagatavoties intervijai.

Jā, pirms sākam aplūkot uzdevumus, apskatīsim dažus vispārīgus interviju sagatavoŔanas padomus.

Galvenais ir sagatavoties iepriekÅ”. Pārbaudiet, cik labi atceraties algoritmus un datu struktÅ«ras, un uzlabojiet savas zināŔanas jomās, kuras nepārzināt. Ir daudzas tieÅ”saistes platformas, kas var palÄ«dzēt sagatavoties intervijām. Mēs konsultējam GeeksforGeeks, Pramp, IntervÄ“Å”ana.io Šø KodsSignāls.

Ir vērts iemācīties skaļi pateikt lēmumu. Ieteicams pretendentiem pastāstīt par to, ko darāt, nevis tikai rakstīt uz tāfeles (vai ierakstīt kodu datorā, arī klusi). Tādā veidā, ja kļūdāties kodā, bet risinājums kopumā ir pareizs, varat palielināt savas izredzes gūt panākumus.

Pirms sākat to risināt, jums ir jāsaprot problēma. Dažos gadÄ«jumos jÅ«s varat saprast uzdevumu virspusēji un pēc tam noiet nepareizo ceļu. Iespējams, ir vērts uzdot intervētājam dažus precizējoÅ”us jautājumus.

Jums ir jāpraktizē koda rakstÄ«Å”ana ar roku, nevis datorā. Gadās, ka interviju laikā pretendentam tiek izdalÄ«ts marÄ·ieris un tāfele, kur nav nekādu mājienu vai automātiskas formatÄ“Å”anas. Meklējot risinājumu, ir vērts pierakstÄ«t savu kodu uz papÄ«ra lapas vai tieÅ”i uz tāfeles. Ja visu paturēsi savā galvā, vari aizmirst kaut ko svarÄ«gu.

Veidņu uzdevumi JavaScript

Iespējams, ka daži no Å”iem uzdevumiem jums jau ir pazÄ«stami. JÅ«s vai nu esat bijuÅ”as intervijas, kurās jums bija jāatrisina kaut kas lÄ«dzÄ«gs, vai arÄ« praktizējāt tās, mācoties JavaScript. Nu, tagad ir pienācis laiks tos atrisināt vēlreiz un detalizēti izskaidrot procesu.

Palindroms

Palindroms ir vārds, teikums vai rakstzÄ«mju secÄ«ba, kas tiek lasÄ«ta tieÅ”i vienādi gan parastajā virzienā, gan pretējā virzienā. Piemēram, ā€œAnnaā€ ir palindroms, bet ā€œgaldsā€ un ā€œJānisā€ nav.

Iestudējums

Dota virkne; jums ir jāuzraksta funkcija, kas ļauj atgriezt patieso vērtību, ja virkne ir palindroms, un false, ja tā nav. Šajā gadījumā jums ir jāņem vērā atstarpes un pieturzīmes.

palindroms('sacīkŔu maŔīna') === taisnība
palindroms('tabula') === false

Analizēsim uzdevumu

Galvenā ideja Å”eit ir apgriezt virkni. Ja ā€œapgrieztāā€ virkne ir pilnÄ«gi identiska oriÄ£inālajai, tad esam saņēmuÅ”i palindromu un funkcijai ir jāatgriež patiesa. Ja nē, tad viltus.

Å Ä·Ä«dums

Å eit ir kods, kas atrisina palindromu.

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

Pirmais solis ir pārveidot ievades virknes rakstzīmes uz mazajiem burtiem. Tā ir garantija, ka programma salīdzinās paŔus rakstzīmes, nevis lietu vai ko citu.

Otrais solis ir mainÄ«t lÄ«niju. Tas nav grÅ«ti izdarāms: tas ir jāpārvērÅ” masÄ«vā, izmantojot .split() metodi (String bibliotēka). Pēc tam mēs apgriežam masÄ«vu, izmantojot .reverse() (masÄ«va bibliotēka). Pēdējais solis ir pārvērst reverso masÄ«vu par virkni, izmantojot .join() (masÄ«va bibliotēka).

Tagad viss, kas jums jādara, ir salÄ«dzināt ā€œapgrieztoā€ virkni ar sākotnējo virkni, atgriežot rezultātu patiess vai nepatiess.

FizzBuzz

Viens no populārākajiem uzdevumiem intervijās.

Iestudējums

Jums ir jāraksta funkcija, kas konsolē drukā skaitļus no 1 lÄ«dz n, kur n ir vesels skaitlis, ko funkcija izmanto kā parametru, ar Ŕādiem nosacÄ«jumiem:

  • izejas fizz, nevis reizinātāju 3;
  • izvadÄ«t buzz, nevis skaitļus, kas ir 5 reizes;
  • fizzbuzz izvade, nevis skaitļi, kas ir gan 3, gan 5 reizinātāji.

Piemērs

Fizzbuzz (5)

Piedzīvojiet efektīvu rezultātu spēku

1
2
// fizz
4
//baumas

Analizēsim uzdevumu

Galvenais Å”eit ir veids, kā atrast reizinātājus, izmantojot JavaScript. To var realizēt, izmantojot moduļa operatoru vai atlikumu - %, kas ļauj parādÄ«t atlikumu, sadalot divus skaitļus. Ja atlikums ir 0, tas nozÄ«mē, ka pirmais skaitlis ir otrā reizināts.

12% 5 // 2 -> 12 nav 5 reizinājums
12% 3 // 0 -> 12 ir 3 reizinājums

Tātad, ja jūs dalāt 12 ar 5, jūs iegūstat 2 ar atlikumu 2. Ja dalāt 12 ar 3, jūs iegūstat 4 ar atlikumu 0. Pirmajā gadījumā 12 nav reizināts ar 5, otrajā gadījumā. , 12 ir 3 reizinājums.

Å Ä·Ä«dums

Optimālais risinājums būtu Ŕāds kods:

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 veic nepiecieÅ”amās pārbaudes, izmantojot nosacÄ«jumu paziņojumus, un rada lietotājam nepiecieÅ”amo rezultātu. Problēmā ir vērts pievērst uzmanÄ«bu if...else priekÅ”rakstu secÄ«bai: sāciet ar dubultu nosacÄ«jumu (&&) un beidziet ar gadÄ«jumu, kad nevarēja atrast vairākus skaitļus. Rezultātā mēs aptveram visas iespējas.

Anagramma

Šis ir vārda nosaukums, kurā ir visi cita vārda burti vienā un tajā paŔā ciparā, bet citā secībā.

Iestudējums

Mums ir jāraksta funkcija, kas pārbauda, ā€‹ā€‹vai divas virknes ir anagrammas, un reÄ£istram nav nozÄ«mes. Tiek skaitÄ«tas tikai rakstzÄ«mes; atstarpes vai pieturzÄ«mes netiek ņemtas vērā.

anagramma ('atradējs', 'draugs') ā€”> taisnÄ«ba
anagramma ('sveiki', 'čau') ā€”> viltus

Analizēsim uzdevumu

Šeit ir jāņem vērā tas, ka ir jāpārbauda katrs burts abās ievades rindās un to numurs katrā rindā.

meklētājs ā€”> f: 1 draugs ā€”> f: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r: 1 d: 1

Lai saglabātu anagrammas datus, jāizvēlas tāda struktÅ«ra kā JavaScript objekta literāls. Galvenais Å”ajā gadÄ«jumā ir burta raksturs, vērtÄ«ba ir tā atkārtojumu skaits paÅ”reizējā rindā.

Ir arī citi nosacījumi:

  • Jums ir jāpārliecinās, ka, salÄ«dzinot, netiek ņemts vērā burtu reÄ£istrs. Mēs vienkārÅ”i pārvērÅ”am abas virknes uz mazajiem vai lielajiem burtiem.
  • Mēs izslēdzam no salÄ«dzinājuma visas personas, kas nav rakstzÄ«mes. Vislabāk strādāt ar regulāras izteiksmes.

Å Ä·Ä«dums

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

Pievērsiet uzmanÄ«bu lietoÅ”anai Object.keys() augstāk esoÅ”ajā fragmentā. Å Ä« metode atgriež masÄ«vu, kurā ir nosaukumi vai atslēgas tādā paŔā secÄ«bā, kādā tie parādās objektā. Å ajā gadÄ«jumā masÄ«vs bÅ«s Ŕāds:

['f', 'i', 'n', 'd', 'e', ā€‹ā€‹"r"]

Tādā veidā mēs iegÅ«stam objekta Ä«paŔības, neveicot lielapjoma cilpu. Problēmā varat izmantot Å”o metodi ar rekvizÄ«tu .length, lai pārbaudÄ«tu, vai abās virknēs ir vienāds rakstzÄ«mju skaits ā€” tā ir svarÄ«ga anagrammu iezÄ«me.

Meklēt patskaņus

Diezgan vienkārŔs uzdevums, kas bieži parādās intervijās.

Iestudējums

Jums ir jāraksta funkcija, kas izmanto virkni kā argumentu un atgriež virknē ietverto patskaņu skaitu.
Patskaņi ir ā€œaā€, ā€œeā€, ā€œiā€, ā€œoā€, ā€œuā€.

Piemērs:

atrast Patskaņus('sveiki') // ā€”> 2
atrast Patskaņus('kāpēc') // ā€”> 0

Å Ä·Ä«dums

Å eit ir visvienkārŔākā iespēja:

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
}

Ir svarÄ«gi pievērst uzmanÄ«bu metodes .includes() lietoÅ”anai. Tas ir pieejams gan virknēm, gan masÄ«viem. Tas jāizmanto, lai noteiktu, vai masÄ«vā ir noteikta vērtÄ«ba. Å Ä« metode atgriež true, ja masÄ«vā ir norādÄ«tā vērtÄ«ba, un false, ja tā nav.

Problēmai ir īsāks risinājums:

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

Tas izmanto .match() metodi, kas ļauj Ä«stenot efektÄ«vu meklÄ“Å”anu. Ja regulārā izteiksme kā metodes arguments tiek atrasta norādÄ«tajā virknē, tad atgrieÅ”anas vērtÄ«ba ir atbilstoÅ”u rakstzÄ«mju masÄ«vs. Nu, ja nav atbilstÄ«bas, tad .match() atgriež nulli.

Fibonači

Klasisks uzdevums, ko var atrast intervijās dažādos lÄ«meņos. Ir vērts atcerēties, ka Fibonači secÄ«ba ir skaitļu virkne, kur katrs nākamais ir iepriekŔējo divu summa. Tātad pirmie desmit skaitļi izskatās Ŕādi: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Iestudējums

Jums ir jāraksta funkcija, kas atgriež n-to ierakstu noteiktā secībā, kur n ir skaitlis, kas tiek nodots funkcijai kā arguments.

fibonači(3) // ā€”> 2

Å is uzdevums ietver cilpas izstaigāŔanu argumentā norādÄ«to reižu skaitu, atgriežot vērtÄ«bu attiecÄ«gajā pozÄ«cijā. Å is problēmas izvirzÄ«Å”anas veids prasa izmantot cilpas. Ja tā vietā izmantojat rekursiju, tas var iepriecināt intervētāju un dot jums dažus papildu punktus.

Å Ä·Ä«dums

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

Rezultātu masÄ«vā pirmie divi skaitļi ir ietverti sērijā, jo katrs ieraksts secÄ«bā ir iepriekŔējo divu skaitļu summa. PaŔā sākumā nav divu skaitļu, kurus var ņemt, lai iegÅ«tu nākamo numuru, tāpēc cilpa nevar tos Ä£enerēt automātiski. Bet, kā zināms, pirmie divi skaitļi vienmēr ir 0 un 1. Tāpēc rezultātu masÄ«vu var inicializēt manuāli.

Kas attiecas uz rekursiju, viss ir vienkārŔāk un vienlaikus sarežģītāk:

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

Mēs turpinām izsaukt fibonači (), kā argumentus nododot arvien mazākus skaitļus. Mēs apstājamies, kad nodotais arguments ir 0 vai 1.

secinājums

Visticamāk, jÅ«s jau esat saskāries ar kādu no Å”iem uzdevumiem, ja esat intervēts par frontend vai JavaScript izstrādātāja darbu (it Ä«paÅ”i, ja tas ir junioru lÄ«menÄ«). Bet, ja jÅ«s ar tiem neesat saskāries, tie var bÅ«t noderÄ«gi nākotnē - vismaz vispārējai attÄ«stÄ«bai.

Skillbox iesaka:

Avots: www.habr.com

Pievieno komentāru