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

На мой взгляд, решение алгоритмов очень похоже на гольф. Гольф, как говорится, на 90% умственный. Вам по-прежнему нужно много практиковать свои физические навыки, но имея твердый план игры, выполняя его как можно лучше и хорошо реагируя на невзгоды, вы действительно добьетесь успеха. Я считаю, что алгоритмы решения почти такие же, особенно когда речь идет о собеседовании.

Представьте себе это. Вы находитесь на собеседовании, и интервьюер просит вас решить проблему. Вы так много тренировались для этого, но смотрите на эту конкретную проблему и совершенно не понимаете, с чего начать. Панические атаки. Блин, что мне делать. Вы тупо смотрите на доску или экран. Огромный ментальный блок заставляет вас забыть все, что, как вы думали, вы знали. Мне нужно написать функцию? Вы как-то разучились писать функцию. Подождите, мне нужно слово "функция"? Нужны ли мне скобки? Наступает синдром самозванца, и вы начинаете спрашивать, почему вы вообще здесь.

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

Итак, без лишних слов, вот алгоритмический подход одного скромного программиста к решению алгоритмов.

Обзор

Вот мой пошаговый процесс. Каждый шаг подробно описан ниже.

  1. Не делайте предположений
  2. Определите полный масштаб проблемы
  3. Подумайте о нескольких стратегиях, которые могут работать
  4. Найдите причины, по которым ваши стратегии не работают
  5. Попробуйте свою стратегию для конкретных случаев, а затем обобщите
  6. Повторяйте шаги 3–5 до достижения успеха.
  7. Усвоить решение

Шаг 1. Не делайте предположений

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

Шаг 2: Определите полный масштаб проблемы

Когда я думаю о «масштабах» проблемы, я думаю о трех вещах:

  1. Что такое ввод? Я работаю с целым числом? Строка? Массив массивов? Что-то другое?
  2. Каков результат? Как будет выглядеть правильный результат? Будьте как можно более конкретными. Просто сказать, что мне нужно создать матрицу n x n целых чисел от 1 до n², не очень поможет. Исходя из моего собственного опыта *, я могу сказать что-то вроде: Мне нужно создать матрицу n x n целых чисел от 1 до n². Это означает массив из n элементов, где каждый элемент сам по себе является массивом из n целых чисел. И мне нужно заполнить каждый отдельный элемент в матрице одним из чисел от 1 до n² в зависимости от позиции этого элемента в матрице, при этом верхний левый элемент начинается с 1, а затем каждый элемент увеличивается на единицу, когда я иду по часовой стрелке. по краю матрицы по спирали внутрь до тех пор, пока последнее целое число n² не будет помещено в середину матрицы. Не считайте само собой разумеющимся, что вы знаете, как должен выглядеть результат, только потому, что вы слышали или читали проблема один раз.
  3. Какие инструменты есть в моем распоряжении? Это, возможно, менее важно, чем первые два, но, особенно во время собеседования, вас могут ограничить или запретить использовать определенные методы. Например, возможно, вам нужно перевернуть массив, но интервьюер специально сказал не использовать .reverse(). С самого начала убедитесь, что вы знаете, что можно и чего нельзя использовать, чтобы в дальнейшем не загонять себя в угол.

Решение алгоритма похоже на решение закодированного сообщения. Для закодированного сообщения вам понадобится кодовый ключ. В противном случае вы застрянете на чепухе. При решении алгоритма, если вы не знаете, с чего начать, может показаться, что у вас есть закодированное сообщение без ключа, и вы смотрите на ерунду. Но этот шаг - ваш ключ. И это может показаться очевидным шагом, но не принимайте его как должное. Даже если вы не знаете, как решить настоящую проблему, вы можете, по крайней мере, знать входы и выходы. (Если вы не уверены, уточните у интервьюера!) Получение этой информации - небольшое достижение. Это прогресс. И это дает вам некоторый импульс. Вместо того, чтобы думать: «О нет, я понятия не имею, что делать!» вы подумаете: «Хорошо, я знаю x, y и z. У меня хорошее начало. Что делать дальше? »

Шаг 3. Подумайте о нескольких стратегиях, которые могут сработать

На этом этапе вы все еще можете не знать, как превратить ввод в нужный вам вывод, и это нормально. Не нужно паниковать, потому что вы выполнили свою практику. И, в отличие от шага 1, сейчас самое время подумать о том, чем эта проблема может быть похожа на другие, которые вы решали ранее. Учитывая информацию, полученную на шаге 2, подумайте о нескольких стратегиях кодирования, которые помогли бы решить аналогичные проблемы. Затем возьмите эти стратегии и для каждой попробуйте рассказать себе историю о том, почему эта стратегия может сработать. Если вы можете придумать историю - отлично. Держите эту стратегию под рукой. Если не можете, откажитесь от этой стратегии. На этом этапе, возможно, вы поймете, что именно вам нужно сделать, но если нет, нет проблем! Переведите свои жизнеспособные стратегии на следующий шаг.

Шаг 4. Найдите причины, по которым ваши стратегии не работают

Посмотрите на свои возможные стратегии и попытайтесь найти причину, по которой каждая из этих стратегий не работает с этой конкретной проблемой. Если вы достаточно попрактиковались, вы сможете довольно хорошо следить за будущими преградами. Если вы не можете найти причину против той или иной стратегии, перейдите к следующему шагу и попробуйте реализовать ее. И не волнуйтесь, если вы не уверены в этом на 100%. Ничего страшного, если эта стратегия окажется неправильной. Вам не нужно придумывать идеальное решение с первой попытки. Неправильная стратегия - отличная возможность продемонстрировать часть своего характера, поскольку то, как вы справитесь с неудачной попыткой, скажет о вас гораздо больше, чем если бы вы просто запомнили решение. И вы всегда можете вернуться к этому шагу, если ваша стратегия не сработает. Так что возьмите свою стратегию и смело переходите к шагу 5.

Шаг 5. Попробуйте свою стратегию для конкретных случаев, а затем обобщите

Хорошо, у тебя есть стратегия. Теперь попробуем применить это к каким-то конкретным случаям. Если входом для задачи является число n, возможно, сначала попробуйте решить для 3. Затем попробуйте 4 и 5. Когда вы это сделаете, произойдет одно из двух. Либо вы поймете, что ваша стратегия нежизнеспособна, либо вы начнете видеть, как вырисовывается шаблон, который будет работать во всех случаях. Если вы нашли шаблон и можете обобщить его в полное решение, поздравляю! Если нет, не волнуйтесь. Будьте уверены. Ты получил это. Вам просто нужно попробовать новую стратегию.

Шаг 6. Повторите шаги 3–5.

Кажется немного банальным для одного шага просто повторять другие шаги, но решение алгоритма не всегда является прямой линией. Есть неплохой шанс, что вы столкнетесь с препятствием с первой попытки, особенно если конкретная проблема не похожа ни на одну из тех, с которыми вы сталкивались раньше. Если это произойдет, не паникуйте. Используйте рекламу в формате Roadblock. Как я упоминал ранее, то, как вы справитесь с этим, многое скажет и о вас как о человеке, и как о кодере. Признайте, что текущая стратегия не сработает, перегруппируйтесь, посмотрите на другие свои стратегии из шага 3, которые, по вашему мнению, могут работать, и продолжайте с этого момента. И, как всегда, будьте уверены. Каждая неправильная стратегия приближает вас на один шаг к поиску правильной. И в конце концов, вы найдете ту, которая подходит именно вам.

Шаг 7: усвоите решение

Ты сделал это! Вы действительно мастер алгоритмов. Но не будьте слишком самоуверенными. Есть еще проблемы, которые нужно решить. Посмотрите, что вы здесь сделали, погрузитесь в то, что сработало, а что нет, проанализируйте, почему это было так, и превратите этот опыт в еще один инструмент в своем арсенале инструментов для решения проблем.

Резюме

Как я уже упоминал выше, я никоим образом не считаю, что эта стратегия лучше, чем какая-либо другая. Но это работает для меня, так что, возможно, это сработает и для вас. Только не используйте эту стратегию (или любую другую) как оправдание, чтобы не практиковаться. Подготовка - это ключ к успеху. Так что работайте усердно, вкладывайте время, укрепляйте свой план игры и приступайте к решению!

* Этот пример является отсылкой к задаче матричной спирали в Учебном курсе с собеседованием по кодированию: алгоритмы + структуры данных, курс по Udemy , созданный Стивеном Грайдером. Я очень, очень рекомендую этот курс всем и каждому. Г-н Грайдер проделывает потрясающую работу по объяснению концепций и поиску решений (часто более одного) для каждого упражнения. (Спасибо, мистер Грайдер!)