Leetcode 2

Leetcode предлагает три уровня сложности задач: Easy, Medium и Hard. Очевидно, что за решения задач более высоких уровней сложности дают больше баллов рейтинга. Но сейчас нас интересует не рейтинг, а отношение к вашему профилю со стороны компании, куда вы будете проходить интервью.

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

Со стороны компании или, что чаще всего, со стороны проводящего интервью лица на ваш профиль может быть разная реакция:

  • кто-то решит, что большое количество Easy-задач не является признаком хорошей подготовки и будет ожидать от вас, как минимум, планки Medium;
  • кто-то скажет, здорово, у меня и того меньше решено — и это случай, когда важнее ваши харды, а не алгоритмы;
  • кто-то порекомендует решать задачи уровня Medium и Hard — чаще всего это будет довольно бесполезной рекомендацией.

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

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

Какого уровня задачу вы бы ни выбрали, всегда:

  • внимательно читайте условие задачи и поймите его;
  • уточните ограничения на выходные данные;
  • точно понимайте, за какое время (речь про O(n)) должен будет отработать ваш код, чтобы не выйти за рамки ограничения по времени.

При отправке решения, если вы не хотите портить статистику — процент принятых решений — используйте для проверки кнопку Run вместо Submit — она запустит ваше решение против тест-кейсов, описанных в примерах к задаче. Более того, вы можете добавить туда собственные тест-кейсы. Самопроверка через Run так же очень полезна, если версия вашего компилятора отличается от версии компилятора платформы. Часто так бывает, что более свежая версия языка позволяет опускать некоторые вещи, но решение принято не будет. Приведу пример на Kotlin:

fun maximumValue(strs: Array<String>): Int =
  strs.map { s ->
    if (s.all { it.isDigit() })
      s.toInt(10)
    else
      s.length
  }.max()

Но версия Kotlin на платформе Leetcode требует явного возврата Int:

fun maximumValue(strs: Array<String>): Int =
  strs.map { s ->
    if (s.all { it.isDigit() })
      s.toInt(10)
    else
      s.length
  }.max() ?: 0

Оба решения компилируются, запускаются и отрабатывают ожидаемо. Но Leetcode примет только последнее, скомпилировав первый пример с ошибкой.

Перед алгоритмической секцией вам, скорее всего, дадут несколько советов:

  • решайте Medium-задачи;
  • используйте таймер, он есть внутри самой платформы;
  • старайтесь уложиться в 25-30 минут.

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

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

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

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

Задачи уровня Medium чуть сложнее, в них потребуется применять те паттерны решений, которые вы отработали на задачах уровня Easy. Часто потребуется их комбинировать или изучать новые алгоритмы. Это хороший шаг вперед, но только тогда, когда вы уже уверенно чувствуете себя в решение простых задач.

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

В следующих заметках перейдём к обсуждению паттернов решений. Спасибо и до связи!