Leetcode 1

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

  • Повысить собственный уровень алгоритмической подготовки — самый очевидный;
  • Опробовать подходы к обработке данных в конкретно взятом языке программирования;
  • Гордиться циферкой рядом с фото профиля — “нагриндить” рейтинг и хвастаться коллегам.

Если речь идёт о первом пункте списка — то есть мы говорим о повышении уровня знания алгоритмов — выбор, по моему мнению, стоит делать из двух языков: Python и тот, на котором вы решаете ваши рабочие задачи.

Совет про Python довольно очевиден: за последние десять лет его стали использовать для преподавания из-за простоты и компактности синтаксиса. Многие задачи на нём можно решить в пару строк кода, что положительно повлияет на способность программиста выражать свои мысли в коде.

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

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

Когда речь идёт о знакомстве с новым языком программирования, а ваша цель научиться использовать его конструкции — задачи с leetcode и подобных сервисов будут очень полезны.

Я приведу пример решения одной из задач. Вот как может выглядеть (и считается эталонным) решение на Go:

func containsDuplicate(nums []int) bool {
    ht := make(map[int]struct{})
    for _, v := range nums {
        if _, found := ht[v]; found {
            return true
        }

        ht[v] = struct{}{}
    }

    return false
}

А вот несколько вариантов решения той же самой задачи с использованием средств Kotlin:

fun containsDuplicate(nums: IntArray): Boolean = nums.size != nums.groupBy { it }.size

fun containsDuplicate(nums: IntArray): Boolean = nums.size != nums.toSet().size

fun containsDuplicate(nums: IntArray): Boolean = nums.size != nums.distinct().size

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

Если же ваша цель “набить” рейтинг, то, надеюсь, содержанием предыдущих двух пунктов мне удалось вас переубедить пересмотреть её. Подготовка и погружение в алгоритмы и языки — процесс, требующий сил и времени. Здесь важно осознавать ценность этой подготовки для вас самих, а не гордиться количеством решенных задач.

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