5 типтік JavaScript сұхбат тапсырмасы: талдау және шешімдер

5 типтік JavaScript сұхбат тапсырмасы: талдау және шешімдер

Аудармашыдан: Сізге мақала жариялады Жалпы JavaScript тапсырмалары туралы айтатын Мария Антониетта Перна, көбінесе әңгімелесу кезінде әзірлеуші ​​үміткерлеріне ұсынылады. Мақала, ең алдымен, жаңадан бастаған бағдарламашыларға пайдалы болады.

Технологиялық компаниялардағы сұхбаттар көптен бері қаланың әңгімесіне айналды. Бұл таңқаларлық емес - сұхбаттан сәтті өту сізге жақсы жұмысқа орналасуға мүмкіндік береді. Бірақ бұл оңай емес, өйткені күрделі мәселелерді жиі шешу керек.

Оның үстіне, көбінесе бұл тапсырмалардың көпшілігі өтініш беруші орындайтын жұмысқа қатысты емес, бірақ олар әлі де шешілуі керек. Кейде мұны Google немесе басқа дереккөзбен тексермей, тақтада орындауға тура келеді. Иә, жағдай бірте-бірте өзгеруде, кейбір компаниялар мұндай сұхбаттардан бас тартуда, бірақ көптеген жұмыс берушілер әлі де осы дәстүрді ұстанады. Бұл мақала жұмыс іздеушілерге арналған тапсырмалар ретінде жиі пайдаланылатын типтік JavaScript тапсырмаларын талдауға арналған.

Біз еске саламыз: «Хабрдың» барлық оқырмандары үшін - «Habr» жарнамалық кодын пайдаланып кез келген Skillbox курсына жазылу кезінде 10 000 рубль көлемінде жеңілдік.

Skillbox ұсынады: Практикалық курс «Мобильді әзірлеуші ​​PRO».

Ең бастысы - сұхбатқа мұқият дайындалу.

Иә, тапсырмаларды қарауды бастамас бұрын, сұхбатқа дайындық бойынша жалпы кеңестерді қарастырайық.

Ең бастысы - алдын ала дайындалу. Алгоритмдерді және деректер құрылымдарын қаншалықты есте сақтауды сынап көріңіз және тым таныс емес салаларда біліміңізді жетілдіріңіз. Сұхбатқа дайындалуға көмектесетін көптеген онлайн платформалар бар. кеңес береміз geeksforgeeks, Прамп, Interviewing.io и CodeSignal.

Шешімді дауыстап айтуды үйрену керек. Үміткерлерге тек тақтаға жазып қоймай (немесе компьютерге кодты үнсіз теріп) не істеп жатқаныңыз туралы айтып берген жөн. Осылайша, егер сіз кодта қате жіберсеңіз, бірақ шешім әдетте дұрыс болса, табысқа жету мүмкіндігін арттыра аласыз.

Мәселені шешуге кіріспес бұрын, оны түсіну керек. Кейбір жағдайларда сіз тапсырманы үстірт түсініп, кейін дұрыс емес жолға түсуіңіз мүмкін. Сұхбат алушыға бірнеше нақтылау сұрақтарын қойған жөн болар.

Кодты компьютерде емес, қолмен жазуды жаттықтыру керек. Әңгімелесу кезінде өтініш берушіге маркер мен тақта беріледі, мұнда ешқандай кеңестер немесе автоматты форматтау жоқ. Шешімді іздегенде, кодты қағазға немесе тікелей тақтаға жазып алған жөн. Егер сіз бәрін ойыңызда ұстасаңыз, маңызды нәрсені ұмытуыңыз мүмкін.

JavaScript тіліндегі шаблондық тапсырмалар

Бұл тапсырмалардың кейбірі сізге бұрыннан таныс болуы мүмкін. Сізде ұқсас нәрсені шешуге тура келетін сұхбаттар болды немесе JavaScript үйрену кезінде олар бойынша тәжірибе жасадыңыз. Енді оларды қайтадан және процесті егжей-тегжейлі түсіндіре отырып шешудің уақыты келді.

Палиндрома

Палиндрома - әдеттегі бағытта да, қарама-қарсы бағытта да бірдей оқылатын сөз, сөйлем немесе таңбалар тізбегі. Мысалы, «Анна» - палиндром, бірақ «үстел» және «Джон» емес.

Кездесу

Жол берілген; егер жол палиндром болса ақиқат, ал болмаса жалған мәнін қайтаруға мүмкіндік беретін функцияны жазу керек. Бұл жағдайда бос орындар мен тыныс белгілерін ескеру қажет.

палиндром('жарыс машинасы') === шын
палиндром('кесте') === жалған

Тапсырманы талдап көрейік

Мұндағы негізгі идея - жолды кері қайтару. Егер «кері» жол түпнұсқамен толығымен бірдей болса, онда біз палиндром алдық және функция шын мәнін қайтаруы керек. Егер жоқ болса, жалған.

шешім

Міне, палиндромды шешетін код.

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

Бірінші қадам - ​​кіріс жолындағы таңбаларды кіші әріпке түрлендіру. Бұл бағдарламаның кейіптерді немесе басқа ештеңені емес, кейіпкерлерді өздері салыстыратынына кепілдік.

Екінші қадам - ​​сызықты өзгерту. Мұны істеу қиын емес: оны .split() әдісі (String кітапханасы) арқылы массивке түрлендіру керек. Содан кейін біз .reverse() (массив кітапханасы) арқылы массивтің бағытын өзгертеміз. Соңғы қадам .join() (массив кітапханасы) арқылы кері массивті жолға түрлендіру болып табылады.

Енді сізге «кері» жолды бастапқы жолмен салыстыру, нәтижені шын немесе жалған деп қайтару жеткілікті.

FizzBuzz

Сұхбаттағы ең танымал тапсырмалардың бірі.

Кездесу

Консольге 1-ден n-ге дейінгі сандарды басып шығаратын функцияны жазу керек, мұндағы n - функция параметр ретінде қабылдайтын бүтін сан, келесі шарттармен:

  • 3 еселіктерінің орнына fizz шығару;
  • 5-ке еселік сандардың орнына дыбыс шығару;
  • 3 пен 5-ке еселік сандардың орнына fizzbuzz шығысы.

Мысал:

Fizzbuzz(5)

нәтиже

// 1 ж
// 2 ж
// физ
// 4 ж
// шу

Тапсырманы талдап көрейік

Мұнда ең бастысы - JavaScript көмегімен еселіктерді табу тәсілі. Оны модуль операторы немесе қалдық - % көмегімен жүзеге асыруға болады, бұл екі санды бөлу кезінде қалдықты көрсетуге мүмкіндік береді. Егер қалдық 0 болса, бұл бірінші сан екіншісіне еселік екенін білдіреді.

12% 5 // 2 -> 12 5-ке еселік емес
12% 3 // 0 -> 12 3-ке еселік

Сонымен, 12-ні 5-ке бөлсеңіз, 2 қалдығы 2 шығады. 12-ні 3-ке бөлсеңіз, 4 қалдығымен 0 шығады. Бірінші жағдайда 12 саны 5-ке еселік емес, екіншісінде , 12 - 3-тің еселігі.

шешім

Оңтайлы шешім келесі код болады:

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

Функция шартты операторлардың көмегімен қажетті тексерулерді орындайды және пайдаланушы талап ететін нәтижені шығарады. Есепте if...else операторларының ретіне назар аударған жөн: қос шарттан (&&) бастап, бірнеше сандар табылмаған жағдайда аяқтаңыз. Нәтижесінде біз барлық нұсқаларды қарастырамыз.

Анаграмма

Бұл басқа сөздің барлық әріптері бірдей санда, бірақ реті басқаша болатын сөздің атауы.

Кездесу

Бізге екі жолдың анаграмма екенін және регистр маңызды емес екенін тексеретін функция жазу керек. Тек таңбалар есептеледі; бос орындар немесе тыныс белгілері ескерілмейді.

anagram('finder', 'Friend') —> шын
анаграмма('сәлем', 'қош') —> жалған

Тапсырманы талдап көрейік

Мұнда ескеретін маңызды нәрсе - екі кіріс жолындағы әрбір әріпті және олардың әрбір жолдағы нөмірін тексеру керек.

табушы —> f: 1 дос —> f: 1
i: 1 r: 1
n: 1 мен: 1
d: 1 e: 1
e: 1 n: 1
r: 1 d: 1

Анаграмма деректерін сақтау үшін JavaScript нысан литералы сияқты құрылымды таңдау керек. Бұл жағдайда кілт - әріптің сипаты, мән - ағымдағы жолдағы оның қайталану саны.

Басқа шарттар бар:

  • Салыстыру кезінде әріптердің регистрі ескерілмейтініне көз жеткізу керек. Біз жай ғана екі жолды кіші немесе үлкен регистрге түрлендіреміз.
  • Біз барлық таңба еместерді салыстырудан шығарамыз. Ең жақсы жұмыс істеу тұрақты тіркестер.

шешім

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

Қолдануға назар аударыңыз Object.keys() жоғарыдағы үзіндіде. Бұл әдіс атаулары немесе кілттері бар массивті нысанда пайда болатын ретпен қайтарады. Бұл жағдайда массив келесідей болады:

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

Осылайша біз көлемді цикл жасамай-ақ объектінің қасиеттерін аламыз. Мәселеде екі жолда бірдей таңбалар саны бар-жоғын тексеру үшін .length қасиетімен осы әдісті қолдануға болады - бұл анаграммалардың маңызды мүмкіндігі.

Дауысты дыбыстарды іздеу

Сұхбатта жиі кездесетін қарапайым тапсырма.

Кездесу

Аргумент ретінде жолды алатын және жолдағы дауысты дыбыстардың санын қайтаратын функцияны жазу керек.
Дауысты дыбыстар «а», «е», «и», «о», «у».

Мысал:

findVowels('сәлем') // —> 2
findVowels('неге') // —> 0

шешім

Міне, ең қарапайым нұсқа:

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
}

.includes() әдісін қолдануға назар аудару керек. Ол жолдар үшін де, массивтер үшін де қол жетімді. Ол массивте белгілі бір мән бар-жоғын анықтау үшін қолданылуы керек. Бұл әдіс массивте көрсетілген мән болса, шын мәнін, ал жоқ болса, жалған мәнін қайтарады.

Мәселенің қысқаша шешімі бар:

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

Бұл тиімді іздеуді жүзеге асыруға мүмкіндік беретін .match() әдісін пайдаланады. Әдіс аргументі ретіндегі тұрақты өрнек көрсетілген жолдың ішінде табылса, қайтарылатын мән сәйкес таңбалардың жиымы болады. Егер сәйкестік болмаса, .match() нөлді қайтарады.

фибоначчи

Әр түрлі деңгейдегі сұхбаттарда табуға болатын классикалық тапсырма. Фибоначчи тізбегі - әрбір келесі алдыңғы екеуінің қосындысы болатын сандар қатарын еске түсіру керек. Сонымен, алғашқы он сандар келесідей: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Кездесу

Белгілі бір реттілікпен n-ші жазбаны қайтаратын функцияны жазу керек, n функцияға аргумент ретінде берілетін сан болады.

фибоначчи(3) // —> 2

Бұл тапсырма мәнді сәйкес орынға қайтарып, аргументте көрсетілген қанша рет цикл арқылы өтуді қамтиды. Мәселені қоюдың бұл жолы ілмектерді пайдалануды талап етеді. Оның орнына рекурсияны қолдансаңыз, ол сұхбат алушыны қуантып, сізге бірнеше қосымша ұпайлар беруі мүмкін.

шешім

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

Нәтижелер массивінде алғашқы екі сан қатарда болады, себебі реттегі әрбір жазба алдыңғы екі санның қосындысы болып табылады. Ең басында келесі нөмірді алу үшін алуға болатын екі сан жоқ, сондықтан цикл оларды автоматты түрде жасай алмайды. Бірақ, біз білетіндей, алғашқы екі сан әрқашан 0 және 1 болады. Сондықтан нәтижелер массивін қолмен инициализациялауға болады.

Рекурсияға келетін болсақ, бәрі бір уақытта қарапайым және күрделірек:

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() деп атай береміз, аргумент ретінде кішірек және кіші сандарды береміз. Өткізілген аргумент 0 немесе 1 болғанда тоқтаймыз.

қорытынды

Егер сіз frontend немесе JavaScript әзірлеушісі жұмысы үшін сұхбат алған болсаңыз (әсіресе ол кіші деңгейде болса) осы тапсырмалардың кез келгеніне тап болған шығарсыз. Бірақ егер сіз оларды кездестірмеген болсаңыз, олар болашақта пайдалы болуы мүмкін - кем дегенде жалпы даму үшін.

Skillbox ұсынады:

Ақпарат көзі: www.habr.com

пікір қалдыру