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. Спасибо за внимание и до связи!