Чтобы подготовиться к будущим техническим собеседованиям, я пытался тратить около часа каждый день на анализ и проработку различных проблем алгоритмов. Я действительно думаю, что они являются отличной практикой для понимания как кодирования в целом, так и данного языка / фреймворка, на котором вы пытаетесь решить эту проблему. Однако я считаю идею использовать их в технических собеседованиях раздражающей, поскольку я не считаю, что это обязательно хороший или точный показатель чьих-либо способностей и навыков программирования. Особенно, когда вы окружаете собеседование контекстом попытки получить работу, характером вопроса, который задается на собеседовании, а также психическим состоянием и настроением собеседника в настоящее время.

Как человек, который привык регистрировать велосипеды для ремонта, я могу сказать вам, что качество моей оценки велосипеда сильно различается, если я остаюсь наедине с байком, и если покупатель нависает надо мной. Велосипеды, как и языки программирования, имеют множество взаимосвязанных и зависимых друг от друга систем. В зависимости от состояния велосипеда и того, какой ремонт запрашивает клиент, мне нужно было бы прислушаться и ощупать многие системы велосипеда, чтобы точно определить, работает ли что-то вроде велосипедной цепи или переключателя скоростей должным образом. Это значительно труднее, когда покупатель смотрит на меня, ничего не говоря, наблюдает за каждым моим движением, становится все более нетерпеливым, ищет хоть какой-то запах сомнения.

Этот сценарий был довольно редким, поскольку в большинстве случаев велосипеды легко диагностируют (или отлаживают) их проблемы. Но когда проблема была немного сложнее, мне нужно было начать думать творчески. В этом сценарии я сравниваю технические собеседования только с тем, что покупатель - это профессиональный велосипедный механик, который действительно знает, что не так с байком, и активно проверяет все, что вы делаете, для решения проблемы. Естественно, это может быть стрессовая ситуация, но наличие достаточной практики и знание хорошего подхода к проблемам кодирования могут помочь снять часть стресса.

Для меня может быть легко даже не знать, с чего начать, когда дело касается решения проблем с кодированием. Но я нашел несколько отличных методов, позволяющих разобрать проблему и показать, что, даже если вы не получаете правильного ответа, вы применяете логический подход к ее решению, и это самое главное. Итак, сегодня я хочу поделиться проблемой, над которой я работал, и стратегиями, которые я использовал для ее решения.

Мои стратегии:

  • повторить проблему
  • разбить проблему на более мелкие, легче решить проблемы
  • попытайтесь решить проблему, даже если решение, которое я придумал, не практично или не привлекательно
  • если я смогу решить эту проблему, решите ее, а затем попытайтесь ее реорганизовать
  • Сначала я выполняю рефакторинг, проверяя, насколько большой O применим к моему решению.
  • если я смогу определить способы сделать решение более эффективным, я постараюсь реализовать эти идеи
  • затем я пытаюсь проявить гибкость, показывая свои навыки стенографии и синтаксиса языка

Проблема:

-конвертировать заданную строку:

function repeat(string)
repeat("abcd") -> "A-Bb-Ccc-Dddd"
repeat("RqaEzty") -> "R-Qq-Aaa-Eeee-Zzzzz-Tttttt-Yyyyyyy"
repeat("cwAt") -> "C-Ww-Aaa-Tttt"

Вот несколько задач, которые потенциально могут быть разбиты на отдельные функции.

повторить: мы должны взять строку и преобразовать ее так, чтобы каждый символ сначала был написан с заглавной буквы, а затем повторял символ в нижнем регистре в зависимости от его позиции в индексе. Подводя итог:

// capitalize the first character
// repeat each character by the index postion they are in
// add a hyphen in between each character

Какие встроенные объекты Javascript могут быть полезны при решении этих проблем?

Я обычно ссылаюсь на MDN, когда не уверен, какие встроенные объекты есть в JS: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference

Вот что я придумал, но есть много инструментов JS или встроенных объектов JS, которые можно использовать для решения этой проблемы, которые я не включил:

// turning the string into an array could be helpful.
// we need to be able to modify each character in the string. 
.split('')
// modifying Arrays
.push()
.pop()
.slice()
.shift()
// now that the string is an array we need to modify this array
.map()
.forEach()
.reduce()
// capitalize characters
.toUpperCase()
// repeat characters 
.repeat()
// put the array back together
.join('')

Давайте создадим функцию, которая разбивает строку на массив, а затем повторяет каждый символ по индексу.

давайте продублируем строку по индексу в ES6:

const string = "abcde";
dupCharByIndex = (s) =>{
  const chars = s.split('');
  return chars.map((char,index) =>{
    return char.repeat(index);
  });
};
dupCharByIndex(string)
//["a","bb","ccc","dddd","eeeee"]

Отлично, мы решили большую часть проблемы с помощью этой функции.

Я стараюсь не беспокоиться, если решение в настоящее время не идеально. Я хочу сначала найти решение, а затем провести рефакторинг.

const string = "abcde";
function capAndHyphenArray(s){
  constchars = dupCharByIndex(s);
  return chars.map(char => {
    if (char.length !== 1){
      const charArray = char.split('');
      const cap = charArray[0].toUpperCase();
      const hyphen = "-";
      charArray.shift();
      charArray.unshift(hyphen + cap);
      return charArray.join('');
     } else {
        return char.toUpperCase();
        };
   }).join('');
 };

Здесь много чего происходит, но это решает почти все. Сможете ли вы определить, каков будет результат?

const string = "abcde";
capAndHyphenArray(s)
// ...

___________________________________________________________________

capAndHyphenArray(string)
// -B-c-dd-eee

И что еще не так с этим решением?

Совет, это связано с входной строкой

___________________________________________________________________

что, если в данной строке уже есть заглавная буква? У нас нет возможности справиться с этим сценарием

const string2 = "AbbbceFGH"

В настоящее время, если ввести эту строку, мы вернемся:

capAndHyphenArray(string2)
// -B-b-bb-ccc-eeee-FFFFF-GGGGGG-HHHHHHH

Нам не хватает первого символа, и если он уже написан с заглавной буквы во входной строке, мы получим неверный результат.

Как мы устраняем это? Что ж, к счастью, поскольку мы разбили эту проблему на более мелкие функции, легче ориентироваться и исправлять наше решение.

Давайте просто сделаем все строки строчными буквами EZ PZ:

dupCharByIndex = (s) =>{
  const chars = s.split('');
  return chars.map((char,index)=>{
    return char.toLowerCase().repeat(index + 1);
  });
};

Мы должны сказать либо index + 1 в повторе, либо index = 1, поскольку мы извлекаем первый символ в нашем массиве с помощью charArray.shift ();

Затем в нашем операторе Else мы присоединяемся к первому символу, который мы устанавливаем в верхний регистр.

const string = "abcde";
function capAndHyphenArray(s){
  const chars = dupCharByIndex(s);
  return chars.map(char => {
    if (char.length !== 1){
      const charArray = char.split('');
      const cap = charArray[0].toUpperCase();
      const hyphen = "-";
      charArray.shift();
      charArray.unshift(hyphen + cap);
      return charArray.join('');
     } else {
        return char.toUpperCase();
        };
   }).join('');
 };
capAndHyphenArray(string)
//A-Bb-Ccc-Dddd-Eeeee

Бинго у нас есть решение. Подведем итоги того, что мы сделали:

-формулируйте проблему, чтобы понять, о чем спрашивают.

-составьте список задач, которые вам предлагает решить проблема

-разбейте задачи на их собственные функции, если это возможно

-проверьте наши функции

Давайте разберемся, как это можно отредактировать, в следующем посте. А пока удостоверьтесь, что вы как можно глубже разбираетесь в подобных проблемах. Проблемы с алгоритмами сложны, и для их решения потребуется практика. Я знаю по себе, как это расстраивает, когда вы проводите время, пытаясь придумать решение, только для того, чтобы запутаться в логике и остаться без ответа. Но, разбив проблему на более мелкие задачи и решив их, вы, по крайней мере, сможете показать, что у вас хорошие навыки решения проблем.