Прошлый пост заминусили, а меня обвинили в рекламе (поверьте мне, если бы я был достаточно заметной персоной, чтобы меня заметили в LeetCode, моей первой репликой было бы "возьмите меня к себе работать", но никак не предложение рекламировать их на Пикабу). Тем не менее, на меня подписались восемь человек, и я вроде как чувствую своим долгом выложить отчет.
Итак, прошла неделя. Я неплохо продвинулся по курсу Grokking Coding Interview Patterns in Java (сейчас завершено 17% курса против 4% неделю назад). Когда я только-только начинал его, то думал, что вряд ли после 4 месяцев на LeetCode узнаю что-то принципиально новое для себя. Но теперь понимаю, что без этого курса мне бы вообще ничего не светило даже в теории. Подача информации там гораздо более структурированная и адаптированная конкретно под прохождение собесов в эти ваши FAANG'и. Ну вот условный паттерн "Fast and Slow Pointer". Я уже использовал его, чтобы решать задачки на поиск loop'ов в связанных списках. Но как оказалось, его можно также использовать для поиска k'th элемента в списке (например, середины), k'th элемента с конца и т.д. А паттерн "Sliding Window" я вообще если и использовал, то чисто интуитивно, даже не догадываясь о его существовании. Короче, курс оказался дико полезным, хоть и местами сложноватым. Сейчас учусь реверсить связанные списки in-place. Забавный факт - всегда использовал для этого колхозную реализацию через рекурсию с новым первым нодом, а тут оказалось, что можно сделать это в обычном цикле на 4 строчки.
Параллельно с этим продолжаю решать алгоритмы на LeetCode, чисто для тренировки. Решил послушать мудрых людей и отказаться от прорешивания алгоритмов уровня Hard (как я понял, их довольно редко дают на собеседованиях, а если и дают, то не ждут полного решения) и Easy (решаются за 2-3 минуты + еще 3 на подумать, как добиться идеальной производительности). Соответственно, сконцентрировался на Medium. Статистика пока далеко от идеала, бывают алгоритмы, которые даются за 10 минут с решением на O(n), бывают такие, которые занимают пару часов. От знакомого в Meta знаю, что показатель готовности к интервью - 15 минут на алгоритм + 15 минут на тесты и вопросы. В общем, знания дико неровные, что наверное характерно для самоучек.
Зато прям хорошо пошел английский. Даже не знаю, что поменялось, просто чувствую, что речь стала более грамотной и в то же время более гладко. Наконец-то начали уходить проблемы с артиклями - это была моя личная боль, успешно прогулял эту тему в универе 10 лет назад, и с тех пор в основном обходился вообще без них. Насколько я понимаю своего преподавателя - мы довольно близко к B2. Цель все та же - сдать IELTS к концу года на случай, если буду идти на иммиграционные программы Канады.
При этом всю неделю я бегал, словно белка в колесе и не знал, за что хвататься. С одной стороны нихреновый завал на работе, где все поуходили в отпуска на майские, с другой домашние задания по английскому и словарь раздутый до 120 слов, с третьей - дедлайн в сентябре на начало собесов в FAANG, с четвертой - жена, домашние дела и кот. В итоге получилось разрулить - попросил уменьшить домашние по английскому, начал вести списки (много списков), чтобы ничего не забывать. С этим начались серьезные проблемы - вплоть до минутных затыков "что же я хотел" у холодильника. Также строго урезал время на один алгоритм (до часа, потом лезу в решение, смотрю логику и пытаюсь воспроизвести у себя). Благодаря всему этому освободилось время на семью. Ну и продал Xbox SX нафиг, вместо него купил читалку - помогает успокоить нервную систему под вечер. По итогу все нормализовалось - привык и вроде как даже начал получать удовольствие от жизни. Ну и в фитнес-зал вернулся - как ни странно, тренировка с утра бодрит лучше, чем кофе (от кофеина полностью отказался два месяца назад).
Цель на следующую неделю - закрыть курс на 30% и прорешать минимум 7 Medium алгоритмов в LeetCode.
Списки - наше все
При обучении алгоритмам стоит помнить, что цель - научиться проходить интервью, а не круто решать алгоритмы
Лучше делать по два часа, но каждый день, чем потратить 7 часов на учебу, и потом ходить с головной болью
Тратить больше часа на один алгоритм означает просто впустую потратить это время. Как правило, за это время решение раздувается, глаз замыливается, а на мониторе написано уже 5 if-ов, чтобы пройти хоть часть тестов. Вероятность, что получится написать читабельный алгоритм на O(n) или O(log n)в таких условиях стремится к нулю. Проще посмотреть решение и понять, что ты делал не так.
Увидимся через неделю-две.