Как стать автором
Обновить

Комментарии 47

Чем лично мне понравился литкод: он мягко заставляет тебя писать тесты ещё и локально, соответственно, продумывать крайние случаи.
Нередко было так, что какое-нибудь решение задачи с обходом дерева занимает 10 строк, а тесты, где есть генерация таких деревьев — раз в 5-10 больше.

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

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

Всегда удивлялся таким людям, которые за пару курсов (или видосов на ютюбе) говорят что освоили ("поднялись на новый уровень") структуры данных и алгоритмам.

2 или 3 года назад я приобрел бумажный вариант Алгоритмы. Построение и анализ (да, та самая бело-голубая книга). Дважды я ее пытался прочесть. Специально сейчас открыл и нашел закладку - 69 страница. 69 из 1281, карл!

Последние 2 месяца я трачу все свободное время на то, что бы подтянуть математику и структуры данных. И все для того что бы попробовать третий раз.

НЛО прилетело и опубликовало эту надпись здесь

У автора (Federico Manucci) в LinkedIn написано:

Università di Bologna

Bachelor's degree, Chemical Engineering

Не известно же какие иммено структуры и алгоритмы он проходил, может прошел массив, хеш и пару сортировок, вот курс и закончился.

А чтение алгоритмов редко бывает полезно. Все вылетает.

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

Так вы начали изучение с Кормена, ещё бы не встрять при этом, там же сплошная теория. Если интерес чисто практический, я бы порекомендовал эту книгу https://algs4.cs.princeton.edu/home/

e-maxx хороший ресурс, если знаешь конкретно какие тебе надо алгоритмы знать заранее. Если же у тебя программы нет, то подборка от профессионалов будет хорошим выбором. В книге, что я посоветовал, как раз про это - самая важная инфа для разработчиков, без перемудреных алгоритмов. Ну по крайней мере мне было очень это доступно и интересно изучить.

И после этой книги можно тут же курс на курсере пройти от автора. Мне чем понравился курс Седжвика - наличием автоматической оценки присланного кода по количеству пройденных юнит-тестов

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

Да, курс прекрасен, я с него начинал. Задания интересные, автоматическая оценка, клевые презенташки.

Мне потребовалось примерно полгода на пару курсов и книжек, чтобы начать решать задачи разного уровня на хакерранке и литкоде за разумное время. И еще год свободного плавания и решения задач, чтобы занимать (пусть и не всегда) 20-какие-то места из 10 000 в соревнованиях на хакерранке и быть в состоянии решить почти любую medium задачу за 20-40 минут.

После LeetCode получаются быдлокодеры, которые пишут примерно такие отходы жизнидеятельности

#include <bits/stdc++.h> // https://stackoverflow.com/questions/25311011/
using namespace std;     // https://stackoverflow.com/questions/1452721/
#define ll long long
#define loop(v, n) for (ll v = 0; v < n; v++)

ll solve(ll a, ll b) {
  loop (i, a)
    loop (j, b)
      cout << i << ", " << j << '\n';
}

int main() {
  solve(1, 2);
}

Просто интересно, как оный код получилось связать с литкодом?

На Stackoverflow приходят с такими решениями со ссылками на задачи LeetCode и GeeksForGeeks и просят помощи в поиске ошибок.

Про GeeksForGeeks ничего не знаю, а у литкода для каждой задачки своя ветка обсуждения, где можно спросить совета, если что-то не получается, или просто посмотреть другие решения. И если на самом деле кто-то от литкода с таким кодом пришел на стековерфлоу, то комментарии в коде прямо указывают на то, что это ctrl-c/ctr-v stackowerflow кодер, который обломался об литкод, не догадался там зайти в обсуждения и вернулся в привычную среду.

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

Этот код я набил сам, показал частые изъяны вопросов на SO от литкодовцев по моей памяти и добавил комментарии, чтобы у здешних читателей вопросов не было.

  1. Растягивание пространства std на глобальное пространство имёнён.

  2. Включение всех заголовочных файлов одним файлом гнутого компилятора.

  3. Переименование макросами нативных типов бессмысленными сокращениями.

  4. То же самое сокращение выраженний макросами.

  5. Отсутствие return. И т.д.

Реальный пример показать не могу. Такие вопросы быстро закрываются и удаляются.

Ну литкод этож ни разу не обучение языку, там тренируешься делать быстрые алгоритмы, обычно в задачке надо реализовать одну единственную функцию, которая всегда что-то вернет. Иногда надо реализовать структуру, но очень редко. Соответственно 1 там по-умолчанию и наверное 2 тоже (уже включенные инклуды просто не виды), 5 не может быть в принципе, ибо всегда надо что-то вернуть (а хотя мейна-то там тоже нет, он полностью скрыт, как и тесты), а 3 и 4 ни разу не встречал, даже когда решал какие-то задачки на с++ и сравнивал с другими решениями, или просто видел в обсуждениях код с++.

Я периодически порешиваю литкод для тонуса и не очень понимаю, откуда это. Правда и в stackoverflow с вопросами не лезу :)

Замечу, что std по умолчанию в нем включен, а в cout еще ни разу не приходилось писать, поэтому это какие-то неправильные пчелы были...

По теме - да, действительно учит чему-то новому. Ну, в моем конкретном случае :)

Это код не с Leetcode, а с контестов по олимпиадному программированию и площадок, на которых они проводятся (вроде Codeforces). Там действительно это общепринятая практика, например Пётр Митричев использует нечто подобное в своих решениях, и назвать его быдлокодером у меня лично язык не повернётся. Нередко набор макросов-сокращений и прочий бойлерплейт занимает >50% от решения. Это лишь специфика контестов - время ограничено, задач много, и париться с вводом всяких long long unsigned не очень приятно.

Понятно, что в продакшене потом так не пишут.

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

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

А в Африке все голые и друг друга едят.

Это больше от олимпиад — там надо код писать максимально быстро. Это правда бывает, но лечится буквально за пару недель при наличии код ревью в компании (что у всех уважающих себя контор уже давно есть).

А есть кто прямо сурово по Leetcode занимался и потом проходил собесы - сколько задач и какого класса вы считаете необходимым для подготовки?

Тут зависит от компании. Скажем если вам FAANG то извольте натренироваться решать сложные задачки.

Если вам в другие компании, то скорее всего достаточно тренировать задачи среднего уровня, но стоит сложного тоже пробовать.

Ещё любят некоторые системный дизайн спрашивать.

А вообще здесь на хабре об этом много статей написано.

у меня на литкоде где то 200 решенных, 50% - легкие, 40% - медиум, 10% - харды. Но я помимо литкода ещё много решал задач, готовился активно месяцев 6-8, задач примерно сотню в месяц решал разной сложности на разных платформах.

Ну да, так и надо.

А я вот начал литкод лёгкий уровень и благополучно забросил:)

Не убедил. Если автор до литкода не умел писать тесты, то возможно надо было освоить TDD, а не литкод. Он научился валидировать данные. Отлично. А для этого точно нужен литкод?

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

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

Мозги что угодно прокачивает, освоение другигих языков программирования или платформ, изучение иностранных языков или даже шахматы. Но вот только очень сомнительно, что шахматы хоть как-то помогут в работе программисту. А вот изучение новых языков программирования очень даже понятно как может помочь.

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

Лучше и то и другое. Ничто так не учит вниманию к деталям и анализу граничных условий как литкод

Проблема в конечности времени.

Когда у тебя пяток пет проектов и вопрос стоит: пет проекты или литкод, литкод выигрывает только перед собесами

Есть два типа разрабов: те, кто считают что leetcode и алгоритмы - must have, и их противники.

Не, еслть ещё те, кто понимают задачу и принципы найма в команду в зависимости от задач команды

На практике выходит так, что пишешь как быстрее, с оглядкой на то, что может это и будет расширяться. А потом пишешь workaround для чужого кода, который писали также. И если есть свободное оплачиваемое время - допиливаешь/рефакторишь/причёсываешь. Куда интереснее в этом плане тестовые задания, когда есть время подумать над архитектурой и реализовать близкий к идеалу вариант.

Решение задач прокачивает мозг. Плюс тренирует мышление и сосредоточенность. Одно только это уже хорошо.

А на LeetCode еще и прокачиваются алгоритмы, структуры данных и граничные условия.

Я решил 500 задач на LeetCode — и они действительно меня чему-то научили

Как раз было бы странно - окажись иначе. Но в среднем и 150 хватает.

начал решать задачке на Leet, споткнулся на первой же задаче, которая была по уровню сложности Easy.

Realy easy (python)?

class Solution:
def romanToInt(self, s: str) -> int:
# Dictionary of roman numerals
roman_map = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
n = len(s)
num = roman_map[s[n - 1]]
for i in range(n - 2, -1, -1):
if roman_map[s[i]] >= roman_map[s[i + 1]]:
num += roman_map[s[i]]
else:
num -= roman_map[s[i]]
return num

Она easy, потому что там можно совсем тупое решение сделать, например, за квадрат: Найдите самый "большой" символ в строке. Прибавьте его к ответу, прибавьте к ответу результат разбора выражения справа, вычтите из ответа результат разбора выражения слева.


Такой подход съест и кучу неверных римских чисел, но в этой задаче все итак дано корректно.

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

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий