5 tasg cyfweliad JavaScript nodweddiadol: dadansoddi ac atebion

5 tasg cyfweliad JavaScript nodweddiadol: dadansoddi ac atebion

Gan y cyfieithydd: cyhoeddi erthygl i chi Maria Antonietta Perna, sy'n siarad am dasgau JavaScript cyffredin, a gynigir amlaf i ymgeiswyr datblygwyr yn ystod cyfweliadau. Bydd yr erthygl yn ddefnyddiol, yn gyntaf oll, i raglenwyr newydd.

Mae cyfweliadau â chwmnïau technoleg wedi bod yn destun siarad y dref ers tro. Ni ddylai hyn fod yn syndod - mae pasio cyfweliad yn llwyddiannus yn rhoi cyfle i chi gael swydd dda. Ond nid yw hyn mor syml, gan fod angen datrys problemau cymhleth yn aml.

Ar ben hynny, yn fwyaf aml, nid yw'r rhan fwyaf o'r tasgau hyn yn gysylltiedig â'r gwaith y bydd yr ymgeisydd yn ei wneud, ond mae angen eu datrys o hyd. Weithiau mae'n rhaid i chi ei wneud ar y bwrdd, heb wirio gyda Google nac unrhyw ffynhonnell arall. Ydy, mae'r sefyllfa'n newid yn raddol, ac mae rhai cwmnïau'n rhoi'r gorau i gyfweliadau o'r fath, ond mae llawer o gyflogwyr yn dal i gadw at y traddodiad hwn. Mae'r erthygl hon wedi'i neilltuo i ddadansoddi tasgau JavaScript nodweddiadol a ddefnyddir yn aml fel tasgau ar gyfer ceiswyr gwaith.

Rydym yn atgoffa: i holl ddarllenwyr "Habr" - gostyngiad o 10 rubles wrth gofrestru ar unrhyw gwrs Skillbox gan ddefnyddio'r cod hyrwyddo "Habr".

Mae Skillsbox yn argymell: Cwrs ymarferol "Datblygwr Symudol PRO".

Y prif beth yw paratoi'n drylwyr ar gyfer eich cyfweliad.

Oes, cyn i ni ddechrau edrych ar y tasgau, gadewch i ni edrych ar rai awgrymiadau paratoi cyfweliad cyffredinol.

Y prif beth yw paratoi ymlaen llaw. Profwch pa mor dda rydych chi'n cofio algorithmau a strwythurau data, a gwella'ch gwybodaeth mewn meysydd nad ydych chi'n rhy gyfarwydd â nhw. Mae yna lawer o lwyfannau ar-lein a all eich helpu i baratoi ar gyfer cyfweliadau. Rydym yn cynghori geeksforgeeks, Pramp, Cyfweld.io и CodArwydd.

Mae’n werth dysgu dweud y penderfyniad yn uchel. Mae'n ddoeth dweud wrth ymgeiswyr am yr hyn rydych chi'n ei wneud, ac nid ysgrifennu ar y bwrdd yn unig (neu deipio cod i'r cyfrifiadur, hefyd yn dawel). Fel hyn, os gwnewch gamgymeriad yn y cod, ond bod yr ateb yn gywir ar y cyfan, gallwch gynyddu eich siawns o lwyddo.

Mae angen i chi ddeall y broblem cyn i chi ddechrau ei datrys. Mewn rhai achosion, efallai y byddwch chi'n deall tasg yn arwynebol ac yna'n mynd i lawr y llwybr anghywir. Efallai y byddai'n werth gofyn ychydig o gwestiynau eglurhaol i'r cyfwelydd.

Mae angen i chi ymarfer ysgrifennu cod â llaw, nid ar gyfrifiadur personol. Mae'n digwydd bod yr ymgeisydd yn cael marciwr a bwrdd gwyn yn ystod cyfweliadau, lle nad oes unrhyw awgrymiadau na fformatio awtomatig. Wrth chwilio am ateb, mae'n werth ysgrifennu eich cod ar ddarn o bapur neu'n uniongyrchol ar y bwrdd. Os ydych chi'n cadw popeth yn eich pen, efallai y byddwch chi'n anghofio rhywbeth pwysig.

Tasgau templed yn JavaScript

Mae'n debyg bod rhai o'r tasgau hyn eisoes yn gyfarwydd i chi. Rydych chi naill ai wedi cael cyfweliadau lle bu'n rhaid i chi ddatrys rhywbeth tebyg, neu wedi ymarfer arnyn nhw wrth ddysgu JavaScript. Wel, nawr mae'n bryd eu datrys eto, a chydag esboniad manwl o'r broses.

Palindrom

Gair, brawddeg neu ddilyniant o gymeriadau a ddarllenir yn union yr un fath i'r cyfeiriad arferol ac i'r cyfeiriad arall yw palindrom. Er enghraifft, palindrom yw "Anna", ond nid yw "bwrdd" a "John".

Llwyfannu

O gael llinyn; mae angen i chi ysgrifennu ffwythiant sy'n eich galluogi i ddychwelyd yn wir os yw'r llinyn yn balindrom, ac yn ffug os na. Yn yr achos hwn, mae angen i chi ystyried bylchau a marciau atalnodi.

palindrom ('car rasio') === gwir
palindrom ('bwrdd') === ffug

Gadewch i ni ddadansoddi'r dasg

Y prif syniad yma yw gwrthdroi'r llinyn. Os yw'r llinyn "cefn" yn union yr un fath â'r un gwreiddiol, yna rydym wedi derbyn palindrom a dylai'r swyddogaeth ddychwelyd yn wir. Os na, ffug.

penderfyniad

Dyma'r cod sy'n datrys y 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('')
}

Y cam cyntaf yw trosi'r nodau yn y llinyn mewnbwn i lythrennau bach. Mae hyn yn warant y bydd y rhaglen yn cymharu'r cymeriadau eu hunain, ac nid achos na dim arall.

Yr ail gam yw gwrthdroi'r llinell. Nid yw hyn yn anodd ei wneud: mae angen i chi ei drawsnewid yn arae gan ddefnyddio'r dull .split() (Llyfrgell Llinynnol). Yna rydym yn gwrthdroi'r arae gan ddefnyddio .reverse() (llyfrgell Array). Y cam olaf yw trosi'r arae wrthdroi i linyn gan ddefnyddio .join() (llyfrgell Array).

Nawr y cyfan sydd angen i chi ei wneud yw cymharu'r llinyn “cefn” gyda'r llinyn gwreiddiol, gan ddychwelyd y canlyniad yn wir neu'n anghywir.

FfizzBuzz

Un o'r tasgau mwyaf poblogaidd mewn cyfweliadau.

Llwyfannu

Mae angen i chi ysgrifennu ffwythiant sy'n argraffu rhifau o 1 i n i'r consol, lle mae n yn gyfanrif y mae'r ffwythiant yn ei gymryd fel paramedr, gyda'r amodau canlynol:

  • allbwn fizz yn lle lluosrifau o 3;
  • buzz allbwn yn lle rhifau sy'n lluosrifau o 5;
  • allbwn fizzbuzz yn lle rhifau sy'n lluosrifau o 3 a 5.

Enghraifft

Ffizzbuzz(5)

Canlyniad

//1
//2
// ffizz
//4
//buzz

Gadewch i ni ddadansoddi'r dasg

Y prif beth yma yw ffordd i ddod o hyd i luosrifau gan ddefnyddio JavaScript. Gellir ei weithredu gan ddefnyddio'r gweithredwr modwlws neu'r gweddill - %, sy'n eich galluogi i ddangos y gweddill wrth rannu dau rif. Os yw'r gweddill yn 0, mae'n golygu bod y rhif cyntaf yn lluosrif o'r ail.

12% 5 // 2 -> Nid yw 12 yn lluosrif o 5
12% 3 // 0 -> Mae 12 yn lluosog o 3

Felly, os rhannwch 12 â 5, byddwch yn cael 2 gyda gweddill o 2. Os rhannwch 12 â 3, cewch 4 gyda gweddill o 0. Yn yr achos cyntaf, nid yw 12 yn lluosrif o 5, yn yr ail. Mae , 12 yn lluosrif o 3.

penderfyniad

Yr ateb gorau posibl fyddai'r cod canlynol:

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

Mae'r swyddogaeth yn cyflawni'r gwiriadau angenrheidiol gan ddefnyddio datganiadau amodol ac yn cynhyrchu'r canlyniad sy'n ofynnol gan y defnyddiwr. Yn y broblem, mae'n werth talu sylw i drefn y gosodiadau os...arall: dechreuwch gyda chyflwr dwbl (&&) a gorffen gyda'r achos lle na ellid dod o hyd i rifau lluosog. O ganlyniad, rydym yn ymdrin â'r holl opsiynau.

Anagram

Dyma'r enw ar air sy'n cynnwys holl lythyrenau gair arall yn yr un rhif, ond mewn trefn wahanol.

Llwyfannu

Mae angen inni ysgrifennu swyddogaeth sy'n gwirio a yw dau linyn yn anagramau, ac nid yw'r achos o bwys. Cymeriadau yn unig sy'n cael eu cyfrif; ni chymerir bylchau neu atalnodau i ystyriaeth.

anagram ('darganfyddwr', 'Ffrind') —> gwir
anagram ('helo', 'bye') —> ffug

Gadewch i ni ddadansoddi'r dasg

Y peth pwysig i'w ystyried yma yw bod angen i chi wirio pob llythyren yn y ddwy linell fewnbwn a'u rhif ym mhob llinell.

darganfyddwr —> f :1 ffrind —> f :1
i :1 r :1
n :1 i :1
d :1 e :1
e :1 n :1
r :1 d :1

I storio data anagram, dylech ddewis strwythur fel gwrthrych JavaScript llythrennol. Yr allwedd yn yr achos hwn yw cymeriad y llythyren, y gwerth yw nifer ei ailadroddiadau yn y llinell gyfredol.

Mae amodau eraill:

  • Mae angen i chi sicrhau nad yw achos llythyrau yn cael ei ystyried wrth gymharu. Yn syml, rydyn ni'n trosi'r ddau linyn i lythrennau bach neu briflythrennau.
  • Rydym yn eithrio pob un nad yw'n gymeriad o'r gymhariaeth. Gorau i weithio gyda ymadroddion rheolaidd.

penderfyniad

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

Rhowch sylw i'r defnydd bysellau gwrthrych () yn y pyt uchod. Mae'r dull hwn yn dychwelyd arae sy'n cynnwys enwau neu allweddi yn yr un drefn ag y maent yn ymddangos yn y gwrthrych. Yn yr achos hwn bydd yr arae fel hyn:

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

Fel hyn rydym yn cael priodweddau'r gwrthrych heb orfod gwneud dolen swmp. Mewn problem, gallwch ddefnyddio'r dull hwn gyda'r eiddo .length i wirio a oes gan y ddau llinyn yr un nifer o nodau - mae hon yn nodwedd bwysig o anagramau.

Chwiliwch am lafariaid

Tasg eithaf syml sy'n codi'n aml mewn cyfweliadau.

Llwyfannu

Mae angen i chi ysgrifennu ffwythiant sy'n cymryd llinyn fel dadl ac yn dychwelyd nifer y llafariaid sydd yn y llinyn.
Y llafariaid yw “a”, “e”, “i”, “o”, “u”.

Enghraifft:

findVowels('helo') // —> 2
findVowels('pam') // —> 0

penderfyniad

Dyma'r opsiwn symlaf:

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
}

Mae'n bwysig rhoi sylw i'r defnydd o'r dull .includes(). Mae ar gael ar gyfer llinynnau ac araeau. Dylid ei ddefnyddio i benderfynu a yw arae yn cynnwys gwerth penodol. Mae'r dull hwn yn dychwelyd yn wir os yw'r arae yn cynnwys y gwerth penodedig, ac yn ffug os nad yw.

Mae yna ateb byrrach i'r broblem:

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

Defnyddir y dull .match() yma, sy'n eich galluogi i weithredu chwiliad effeithlon. Os canfyddir mynegiant rheolaidd fel dadl ddull y tu mewn i'r llinyn penodedig, yna mae'r gwerth dychwelyd yn amrywiaeth o nodau cyfatebol. Wel, os nad oes unrhyw gemau, yna mae .match() yn dychwelyd null.

Fibonacci

Tasg glasurol y gellir ei chanfod mewn cyfweliadau ar wahanol lefelau. Mae'n werth cofio bod y dilyniant Fibonacci yn gyfres o rifau lle mae pob un dilynol yn swm y ddau flaenorol. Felly, mae’r deg rhif cyntaf yn edrych fel hyn: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Llwyfannu

Mae angen i chi ysgrifennu ffwythiant sy'n dychwelyd yr nfed cofnod mewn dilyniant penodol, gydag n yn rhif sy'n cael ei basio fel dadl i'r ffwythiant.

Fibonacci(3) // —> 2

Mae'r dasg hon yn cynnwys cerdded trwy ddolen y nifer o weithiau a nodir yn y ddadl, gan ddychwelyd y gwerth yn y safle priodol. Mae'r ffordd hon o osod y broblem yn gofyn am ddefnyddio dolenni. Os ydych chi'n defnyddio ailadrodd yn lle hynny, efallai y bydd yn plesio'r cyfwelydd ac yn rhoi ychydig o bwyntiau ychwanegol i chi.

penderfyniad

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

Yn yr arae canlyniadau, mae'r ddau rif cyntaf wedi'u cynnwys yn y gyfres oherwydd bod pob cofnod yn y dilyniant yn swm y ddau rif blaenorol. Ar y cychwyn cyntaf nid oes dau rif y gellir eu cymryd i gael y rhif nesaf, felly ni all y ddolen eu cynhyrchu'n awtomatig. Ond, fel y gwyddom, y ddau rif cyntaf bob amser yw 0 ac 1. Felly, gallwch gychwyn y casgliad canlyniadau â llaw.

O ran dychwelyd, mae popeth yn symlach ac yn fwy cymhleth ar yr un pryd:

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

Rydyn ni'n dal i ffonio Fibonacci (), gan basio niferoedd llai a llai fel dadleuon. Rydyn ni'n stopio pan fydd y ddadl a basiwyd yn 0 neu 1.

Allbwn

Yn fwyaf tebygol, rydych chi eisoes wedi dod ar draws unrhyw un o'r tasgau hyn os ydych chi wedi cael eich cyfweld ar gyfer swydd datblygwr blaen neu JavaScript (yn enwedig os yw ar lefel iau). Ond os nad ydych wedi dod ar eu traws, efallai y byddant yn ddefnyddiol yn y dyfodol - o leiaf ar gyfer datblygiad cyffredinol.

Mae Skillsbox yn argymell:

Ffynhonnell: hab.com

Ychwanegu sylw