Обновление: Я попал в Facebook!

Важно, чтобы вы выполнили некоторую подготовительную работу до попрактиковаться в Leetcode, GeeksForGeeks или Cracking the Coding Interview (CTCI) - особенно если вы давно закончили колледж. назад или самоучки.

Не беспокойтесь о конкуренции.

Многие люди разочаровываются, потому что думают, что будут соревноваться с молодыми, недавними выпускниками, у которых есть все время в мире, чтобы пересмотреть то, что они только что выучили. Мне это кажется забавным, потому что многие недавние выпускники также разочаровываются, думая, что им предстоит столкнуться с «профессионалами» с «реальным жизненным опытом» (что бы это ни значило).

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

Компании отчаянно нуждаются в SE - если вы только сможете доказать, что вы достаточно хороши, они вас возьмут. Для талантливых инженеров практически нет ограничения на набор персонала, особенно в крупных технологических компаниях. Во многих случаях они будут готовы создать для вас новые роли, если вы хорошо справитесь с собеседованием. Если вы будете практиковаться с умом и решите достаточно проблем на Leetcode / CTCI, вы будете в хорошей форме. Не беспокойтесь о конкуренции.

Темы

Этот раздел очень важен, поэтому обратите внимание. Перед тем, как начать Leetcoding, вам нужно изучить / освежить список важных тем. Если вы этого не сделаете, вы потеряете время зря. Помните два следующих правила:

  1. Не тратьте слишком много времени на подготовительную работу.
  2. Не тратьте слишком мало времени на подготовительную работу.

Если вы потратите слишком много времени на обучение, вам никогда не удастся решить проблемы Leetcode / CTCI. И наоборот, вы потеряетесь, если потратите слишком мало времени на подготовительную работу. Важно, чтобы вы потратили правильное количество времени на подготовительную работу, чтобы не тратить свое время зря.

Прежде чем что-либо делать, обязательно просмотрите / изучите темы ниже. Изучение чего-либо дополнительного может оказаться пустой тратой вашего времени. Некоторые люди изучают намного больше, чем им нужно (например, алгоритмы причудливых графов, связующее дерево, A * и т. Д.), Потому что они думают, что это сделает их лучшими инженерами. На мой взгляд, это пустая трата времени. Большинство интервьюеров сами не запоминают эти темы. Вы сможете изучить их самостоятельно, как только получите работу своей мечты. Не тратьте время зря. Просто сосредоточьтесь на изучении структур данных и алгоритмов ниже. Ни больше ни меньше.

Структуры данных

  • Динамический массив
  • Связанный список
  • Стек и очередь
  • Хеш-таблицы
  • Дерево двоичного поиска
  • Двоичные кучи и приоритетная очередь
  • Графики
  • Trie

Алгоритмы

  • Битовые манипуляции и числа - разница между беззнаковыми и подписанными числами
  • Стабильность сортировки
  • Сортировка слиянием
  • Быстрая сортировка
  • Heapsort - Сортировка по месту, чтобы получить O (1) места
  • Бинарный поиск
  • Выборки - K-е наименьшие элементы (Сортировка, Быстрый выбор, Среды или Среды) - Реализуйте все три способа
  • Перестановки
  • Подмножества
  • График BFS
  • График DFS
  • Алгоритм Дейкстры (просто изучите идею - не нужно реализовывать)
  • Обход дерева - BFS, DFS (в порядке, перед заказом, после заказа): реализовать рекурсивный и итерационный
  • Внешняя сортировка - без реализации; Просто знайте концепцию.
  • NP-Complete (Видео) - Просто ознакомьтесь с концепцией
  • Топологическая сортировка
  • Обнаружить цикл в неориентированном графе
  • Обнаружить цикл в ориентированном графе
  • Подсчитайте связанные компоненты в графе
  • Найдите компоненты сильной связности в графе

Подготовка к работе

Когда вы освоитесь со структурами данных и алгоритмами, описанными выше, выполните следующее упражнение несколько раз (как минимум 2–3 раза), пока не сможете выполнять их с закрытыми глазами.

  • Реализуйте ArrayList с нуля
  • Перевернуть связанный список
  • Реализуйте стек и очередь с помощью массива
  • Реализуйте HashTable с помощью простых функций хеширования
  • Реализуйте график, используя список смежности, а затем напишите функции для BFS и DFS.
  • Напишите алгоритм двоичного поиска как рекурсивно, так и итеративно
  • Напишите алгоритм сортировки слиянием
  • Напишите алгоритм быстрой сортировки
  • Распечатайте двоичное дерево с помощью DFS (по порядку, по предварительному заказу и по почте - все три) и BFS.
  • Запомните временные и пространственные сложности для общих алгоритмов. Вот интересный сайт.
  • Реализуйте дерево.
  • Изучите эти важные приемы работы с битами.

Следующий шаг

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

Мотивация

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

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

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

Где бы вы ни были и кем бы вы ни были, я молюсь о вашем успехе ❤️.

Удачи кодированию 👨‍💻!