Максим Фатин | про IT
4.14K subscribers
202 photos
4 videos
105 links
Помогаю с подготовкой к собеседованиям в RU Big Tech

https://clck.ru/3RdRKN

● Вместе с командой помогли 100+ разработчикам попасть в BigTech
● Жму 100-ку на 2 раза (есть куда расти)
● Люблю есть ночью)

Связь через Карину:
@Karina_algocode_io
Download Telegram
Что не так с деревьями?

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

И это правило везде одно: решил не оптимально с точки зрения Big O — НА ВЫХОД!

Но почему-то это правило обошло деревья стороной...

Окей, окей — вот условие задачи прямо с собеса:

Дан корень правильного бинарного дерева поиска и число k. Нужно вернуть k-й наименьший элемент в дереве (отсчёт начинается с 1).

Бинарное дерево — значит, у каждой вершины не более двух детей.

Дерево поиска — значит, все элементы в левом поддереве меньше текущего, а в правом — больше.

Короче, вот пример дерева — и всё сразу станет ясно:


4
/ \
2 6
/ \ / \
1 3 5 7


Пусть k = 3. Тогда третий наименьший элемент — это 3, именно её и нужно вернуть по условию.

Чтобы решать задачи на деревья, нужно знать три обхода: preorder, inorder, postorder.
Они позволяют обойти все вершины дерева в определённом порядке.

Для примера выше:

preorder: 4, 2, 1, 3, 6, 5, 7
inorder: 1, 2, 3, 4, 5, 6, 7
postorder: 1, 3, 2, 5, 7, 6, 4


Заметил? inorder выдал отсортированный порядок — и это не совпадение!

Если дерево — правильное бинарное дерево поиска, то inorder всегда выдаёт отсортированную последовательность.

Реализация inorder-обхода:


from typing import *
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right

def traversal(node: Optional[TreeNode], result: List[int]) -> None:
if node is None:
return
traversal(node.left, result)
result.append(node.val)
traversal(node.right, result)

def inorder_traversal(root: Optional[TreeNode]) -> List[int]:
result = []
traversal(root, result)
return result


Простое решение задачи:
1. Запускаем inorder и получаем отсортированный список.
2. Возвращаем k-й элемент (с индексом k - 1).

Оценка: время — O(n), память — O(n).

Но! Такое решение на собеседовании часто не принимают. Слишком много дополнительной памяти — хочется оптимальнее.

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


from typing import *
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right

def smallest_bst_element(root: TreeNode, k: int) -> int:
def inorder(node: TreeNode) -> int:
if node is None:
return None
result = inorder(node.left)
if result is not None:
return result
nonlocal k
k -= 1
if k == 0:
return node.val
return inorder(node.right)
return inorder(root)


Оценка: время — O(n), память — O(n).

WTF? Почему такие же оценки, если вроде оптимизировали?

Пусть k = 1, а дерево выглядит вот так — «бамбук» с уклоном влево:

4
/
3
/
2
/
1


Видишь? Нам всё равно придётся спуститься в самый низ, чтобы достать единицу — самый минимальный элемент.

А память откуда O(n)? Из-за рекурсии, брат! Каждый рекурсивный вызов занимает место в стеке.

В худшем случае это O(h), где h — высота дерева, а если дерево вытянутое, то просто h = n.

P.S. продолжение через минуты
🌭7🍓4
Что не так с деревьями?

🤙🤙🤙 Продолжение поста выше

📌 Много букв, но ты справишься!

---------

А теперь, когда ты всё это прочитал, самый прикол!

Это решение всё ещё не самое оптимальное. Дело в том, что есть обход Морриса (Morris Traversal). Такой обход не использует рекурсию и стек, поэтому решение получается O(n) по времени и O(1) по памяти.

С ним решение выглядит так:


from typing import *
from algocodelib import TreeNode

def smallest_bst_element(root: TreeNode, k: int) -> int:
curr = root
while curr:
if curr.left is None:
# посещаем узел
k -= 1
if k == 0:
return curr.val
curr = curr.right
else:
# ищем inorder-предшественника (правыйmost узел в левом поддереве)
pred = curr.left
while pred.right and pred.right is not curr:
pred = pred.right
if pred.right is None:
# создаём временную ссылку
pred.right = curr
curr = curr.left
else:
# убираем ссылку и посещаем узел
pred.right = None
k -= 1
if k == 0:
return curr.val
curr = curr.right
return -1 # если k больше, чем количество узлов


Юху! Решили оптимально!

Но вот интервьюер вряд ли такое оценит...

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

В общем, рекурсия в деревьях для решения задачи — это база. Да, не оптимально по памяти в худшем случае, но это база!

Где такое возможно еще??? А вот почти нигде - деревья тут отличились. В остальных темах надо оптимально решать...

Всем достаточно рекурсивного обхода 🙂

P.S. Если встретимся на собесе и ты расскажешь про обход Морриса и напишешь без ошибок — вторую задачу не дам: сразу апрув

Бахни 🌭 если зашел формат лонгрида! Если наберем 80+ сосисонов, то буду чаще в таком формате посты делать
🌭115
А Озон-то не так прост!

Вообще, мало где дают задачки на системы счисления — так что Озон тут выделяется.


Недавно попалась вот такая задачка:

Дан номер колонки в Excel. Нужно назвать её порядковый номер.

Примеры:

A -> 1
B -> 2
...
Z -> 26
AA -> 27
AB -> 28


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

ord — это функция, которая возвращает ASCII-код символа.

Например:

ord('A') = 65
ord('B') = 66
...
ord('Z') = 90


Да, без этого можно обойтись, но это база, как говорится.

Таким образом, мы можем сопоставить каждой букве её номер:


'A' -> ord('A') - ord('A') + 1 = 1
'B' -> ord('B') - ord('A') + 1 = 2
...
'Z' -> ord('Z') - ord('A') + 1 = 26


Бинго!

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

Теперь можно воспринимать строку так:


'AB' → [1, 2] → 1 * 26 + 2 = 28
'ABCD' → [1, 2, 3, 4] → 1 * 26³ + 2 * 26² + 3 * 26 + 4


Откуда взялось 26?

У нас всего 26 различных символов. Если бы алфавит был только A B C, то умножали бы на 3...


Осталось только собрать всё вместе:


from typing import *

# Время: O(n)
# Память: O(1)
def int_from_excel_column(column: str) -> int:
result = 0
for ch in column:
val = ord(ch) - ord('A') + 1
result = result * 26 + val
return result


ВАЖНО!

Ожидают решение по памяти за O(1), так что составлять массив из чисел, а потом считать результат — не вариант (это было нужно только для объяснения).

В боевом решении всё должно быть оптимально.

Вообще, формула:

result = result * 26 + val

— это классика. Она будет часто встречаться, так что смело запоминай.

Решить задачку можно у нас на algocode.io как и другие задачи Озона:

https://algocode.io/courses/algo-big-tech/problem/int-from-excel-column

или на leetcode:
https://leetcode.com/problems/excel-sheet-column-title/description/
❤‍🔥22🌭7
Что спросить у СТО, чтобы тебя наняли на высокий грейд?

Проходя собесы, я начал 1.5 года назад активно общаться с СТО на финальной секции

Получается, уже не просто маслёнок...

Как правило, это серьёзные дяди — и разговорить их было не всегда просто

Я прям видел отвращение в лицах после вопросов:
- «А какая версия Go у вас в проектах?»
- «А есть компенсация обедов?»

Просто разрыв живота 99-го уровня — как вспомню своё общение с СТО полтора года назад...

Главное правило общения с лидом и СТО, которое я вынес, чтобы вопросы не вызывали отвращения:

Не спрашивай то, на что может ответить рекрутер или то, что уже написано в вакансии. Потом у рекрутера уточнишь, если тебе важно.

А теперь важно определить цель вопросов:

Для себя с понял: у каждого вопроса должна быть цель, а не просто повыделываться типа умный

Например, для себя я понял:

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

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

- Хочу работать в богатой компании или там, где знаком с владельцем бизнеса. Всё просто: если компания уже богатая, значит, там дофига людей, с кем можно познакомиться и перенять опыт. Если мелкая — то я хочу вносить импакт на уровне всей компании, а для этого нужно общаться с собственником

И теперь у меня есть простой чеклист

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

И знаете что?

99% fit-собесов я просто скипаю, потому что я не подхожу команде или она мне...

У меня нет задачи нравиться всем. Я хочу самый пиздатый матч, который только возможен.

Чтобы компания, которая меня нанимала, заработала на мне Х10, а лучше — Х100


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

WIN-WIN

Я не хочу быть посредственным!
Просто не хочу.

Так что вот мои вопросы:

- Какие цели у юнита на год, и у команды, куда меня рассматриваете, в частности?

- Какую роль продукт оказывает на бизнес и является ли ключевым?

- Какие ожидания у бизнеса от продукта? На какие метрики смотрит бизнес?

- Чем отличаетесь от конкурентов / планируете отличаться и кто они?

- Какие направления развиваете: B2B/B2C/B2G, и какие по ним планы?

- Довольны ли вы сейчас работой команды, куда меня нанимают, или есть критические поинты для улучшения?

----

В общем, я отказался от вопросов про ЯП 😂

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

Этот чеклист точно не для тех, кто ищет первую работу.

Но зато тот 1%, в который попадает матч, выкатывает очень приятные офферы на 600+ кэсов.

А какие вопросы на финалах задаёшь ты? Интересно будет глянуть комменты

P.S. экспериментирую с форматами постов так что бахни 🌭 если зашло
🌭94❤‍🔥9🍓3
Стартует запись на курс по графам!

Курс пройдет с 25 ноября по 9 декабря

- Программа из тем
- Про домашки
- Про проверку домашек
- Как попасть на курс
- ...
https://telegra.ph/Kurs-Grafy-s-0-do-PRO-11-05

Число мест для live-участия ограничего!

Для тех, кто решится на онлайн - советую подавать заявку как можно раньше,
потому что уже начали анализировать заявки

P.S. обязательно буду делиться с вами ключевыми инсайдами по ходу курса, чтобы все могли получить пользу
🌭9❤‍🔥4🤣1
Как понять графы с нуля? Как объяснить их так, чтобы понял даже мой 14-летний брат?

Я нашёл ответ!

Проанализировав все свои лекции по графам, вопросы, которые задают, и комментарии на YouTube, я понял самое главное: при объяснении таких тем, как DFS и BFS, часто мешает визуализация. Всё дело в восприятии: ты глазами видишь «кратчайший путь»/пытаешься додумать алгоритм — и это сильно мешает пониманию на старте

Я решил эту проблему так: буду визуализировать не то, что видит человек, а то, как это видит компьютер. То есть поле — полностью тёмное, и каждую клетку нужно «открыть» только в тот шаг алгоритма, когда алгоритм действительно до неё дошёл. Это заметно упрощает понимание DFS и BFS. Но при этом не у кого не видел такого объяснения

Если сейчас ты сам учишь графы, особенно DFS и BFS, попробуй нарисовать поле полностью тёмным и открывать клетку только в тот шаг алгоритма, когда нужно её открыть

Чтобы не додумывать и не рисовать вручную, я снял ролик про графы на 40 минут — это будет как вступление к курсу, который готовлю для сообщества algocode.io. Ролик будет на YouTube, так что бахни хот-дог, если хочешь освоить тему графов

P.S. как всегда - самое долгое монтаж, так что выйдет в конце ноября примерно

А я пошёл дописывать курсец по графам и искать для тебя новые способы хакнуть алгосы и получить конкурентное преимущество
🌭91❤‍🔥6
Что за топологическая сортировка?

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


JIRA1 → JIRA2
JIRA2 → JIRA3
JIRA3 → JIRA1


Выглядит так, что нужно сделать задачу 1 перед задачей 2, задачу 2 перед задачей 3, а задачу 3 перед задачей 1. И тут мы должны послать продакта пересматривать требования

А что если задач 100?

Так вот, тут пригодится детектирование циклов в графе — оно поможет понять, есть ли такая ебучая ситуация или нет

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

Итого: топологическая сортировка помогает определить порядок выполнения действий с учётом всех зависимостей и может быть выполнена только если нет ебучих циклов

Как можно проверить наличие цикла в графе? → модификация поиска в глубину (DFS)
Как можно выполнить топологическую сортировку? → модификация поиска в глубину (DFS)

P.S. Сейчас как раз эту тему для курса по графам готовлю, так что решил поделиться

Йоу! Бахни 🌭 если не знал о топологической сортировке
🌭61🍓2
Почему ты не можешь сменить работу/найти новое место?

Сейчас кризис, денеги дорогие (высокие проценты для кредитов/инвестиций и т д) -> бизнесу тяжеловато. А что происходит, когда тяжело: срезают косты, в том числе на ФОТ (фонд оплаты труда) -> активно не нанимают, а если и нанимают, то в основном джунов или топов

Про «активно не нанимают, а если и нанимают, то в основном джунов или топов» — это не моя выдумка или предположение, а то, что я вижу сейчас в BigTech компаниях

Но нанимают ли? ДА ДА ДА! Там половина бигтеха из кожи вон лезет, чтобы staff-инженеров к себе захапать быстренько, и X2 X3 наваливают офера, пока рынок замер

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

Кризис - время отчищения от конкурентов и шанс монополизации рынка. Кто такое упустит)

Ситуация со мной: я долго работал с высоконагруженным ClickHouse, и когда вышел на рынок, то резко стал получать офера 600 000+, хотя недавно вроде были все около 400 000

НО! Только в те команды, кому реально нужен был ClickHouse. В обычные команды — 500, ну 520 максимум

У меня появилась уникальность. Я буквально мог ответь на вопрос: «А чем ты лучше 99% кандидатов? Почему ты?»

Ко мне регулярно заходят рекрутеры, и в целом я как будто не ощутил особо, что кризис есть какой-то

А ты уже придумал, в чём будешь качать экспертизу, чтобы не утонуть в болоте рынка труда в 2026? Инвестиции в какой твой навык дадут наибольшую окупаемость тебе в ближайшие 3 года?

P.S. бахни 🌭 если задумался — ведь именно это главная цель поста.
А это значит, что ты уже на шаг впереди и можешь найти ответ на этот вопрос, пока остальные только начнут соображать, что вообще происходит

А это уже называется — конкрентное преимущество

Если наберем 100 🌭 расскажу про свои ставки

UPD: Кайф, сосисоны набрали - так что в понедельник сделаю пост об этом, включай уведомления, чтобы не пропустить
🌭168🤣5
Какая ставка сыграет в 2026 на рынке труда?

Расскажу, на что ставлю лично я — и почему именно так:
- System Design
- Опыт управления командой
- Алгоритмы
- Golang
- ClickHouse
- Kafka

В моём случае это тот набор, который я буду шлифовать до блеска. Особенно — менеджмент. Для меня это сейчас ключевая точка роста

Я не буду тратить время на PostgreSQL, RabbitMQ и ещё тысячу технологий.
Но в тех, что выбрал — я буду просто богом


Очень давно замечаю тренд на вечных среднячков:
- «Средне» знаю PostgreSQL
- «Средне» знаю Kafka
- «Средне» знаю K8s
- «Средне» знаю всё…

И зарплата, соответственно, тоже средняя.
Это нормально, пока ты растёшь до мидла.
Но что потом?

Как конкурировать с человеком, который 10 лет работает с ClickHouse, если это ключевая технология в вакансии?

Никак!


Нужно самому стать тем чуваком с 10 годами опыта.
И ты автоматически попадёшь в топ-1% рынка.
А если хотя бы немного подтянешь медийку — компании сами будут просить тебя забрать у них деньги, лишь бы ты решил их проблему

Но возникает вопрос:
- Когда менять стек, который выбрал?
- Что делать, если ставка не сыграет и ClickHouse станет не актуален?
- И есть ли что-то, на что я ставлю даже сильнее, чем на ClickHouse?

Если соберём 100 🌭 — запишу большой подробный видос на тему
«Нечестная конкуренция: как получать ЗП выше рынка»
и разберу всё от и до

А какие ставки у тебя?

UPD: видосу быть!
🌭185🤣2🍓1
Тернарный поиск — вот это я понимаю!

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

Он применяется в задачах, где функция сначала растёт, а потом падает — или наоборот.
Результат тернарного поиска — точка максимума или минимума


Пример задачки: Скорость болида на каждом километре:


Км: 0 1 2 3 4 5
V: 30 48 62 70 65 40


Скорость сначала растёт, потом падает — унимодальна.
Нужно найти километр, на котором скорость максимальная

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


Пример кода:
def ternary_search_max(a):
l, r = 0, len(a) - 1
while r - l > 3:
m1 = l + (r - l) // 3
m2 = r - (r - l) // 3
if a[m1] < a[m2]:
l = m1
else:
r = m2
# выбираем максимум на оставшемся участке
return max(range(l, r + 1), key=lambda i: a[i])

a = [30, 48, 62, 70, 65, 40]
print(ternary_search_max(a)) # 3


Время: O(log₃ n)
Память: O(1)

А это как говорится вам не по циклу пройтись и все варианты перебрать, а кратно быстрее

Ну и если постец дочитываю до конца, то всегда поддержу автора и бахну ему сосисон 🌭
🌭151
Пост под тихую

Пятница — все расслабились и вряд ли прочитают пост до конца, а с тобой поделюсь

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

- Обход в глубину (DFS)
- Обход в ширину (BFS)

Например:

Если задача решается DFS/BFS и можно изменять входной массив — не обязательно аллоцировать used/visited-массив. Можно редактировать исходный и сэкономить память (неасимптотическая оптимизация)

НО! Только если можно менять исходный массив


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

> «А тут можно менять входные данные?

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

> Если нет — то тут по классике решу…»

И именно благодаря набору таких узких кейсов и на собеседовании и при разборе разных решений рождается спокойствие

Ты просто уже все это знаешь

Ты все это видел

И знаешь наверняка в каком кейсе, какое решение оптимально

И я собрал вообще все такие кейсы
в ходе анализа множества задач и решений на LeetCode, статей и YouTube. И конечно, задач с собеседований RU BigTech.

25 ноября стартую с ребятами в живом формате курс по графам.
И там раскрою все карты, чтобы дать то самое конкурентное преимущество в алгоритмах

А со всеми вами обязательно поделюсь самым ключевым!

В общем, если есть кайф — заходи в сообщество. Все записи созвонов и задачи курса будут там:
https://algocode.io/community
🍓16🌭7
Главный стоп-фактор роста middle-разработчика

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

Некий джетпак!

Погоняли тут со знакомым лидом на выходных эту тему, чтобы найти ТОП-1 маркер, по которому тебя будут хотеть повысить быстрее, чем других

Чтобы твой лид буквально молил тебя перейти на следующий грейд

Мы сошлись на том, что это — самостоятельное принятие решений

После этого я рефлексировал и действительно нашёл этому множество подтверждений: как только появляется собственное видение продукта, как только появляется самостоятельность в принятии решений и готовность взять за них ответственность —

это сразу +1 уровень в карьере. Просто моментально


Если соберём 100 🌭 — расскажу на неделе про Senior

UPD: посту быть, в пятницу напишу
🌭160❤‍🔥2🍓2
Как обгонять на карьерных поворотах?

Вчера на вступительной лекции сообщества курса по графам (ага, в начале всегда мотивация) рассказал про простую формулу

РЕЗУЛЬТАТ = ТОЧНОСТЬ * СИЛА

Точность — это то, насколько правильным и перспективным путём ты идёшь

Сила — это то, как много усилий прилагаешь для результата

Вкладываться в сильных со стороны компании очень выгодно. Показал траекторию, а он там всех дёрнул и точность накачал как бицуха Шварценеггера

Направить как правило не сложно, сложно сделать и результат показать

Я выбрал ебашить и ни разу не пожалел. Work Life Balance? - у меня его нет. Но карьера - прям как мечтал в 20

А на что ставку сейчас делаешь ты? На силу или точность?

----

P.S. Узнал тут про чела с 30+ лет опыта, который работает +-1 час в день и получают по 2 000 000 в месяц за свою экспертизу в архитектуре
Но как же он ебашил, когда ему было 20
🌭18❤‍🔥5🤣4
Главный стоп-фактор для Senior

Senior может расти и в лида, и в IC, но я хочу вывести тебя на самую суть - общий стоп-фактор, который работает в любой ветке развития!

Вот несколько примеров из моей практики и практики знакомых лидов:

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

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

Кажется, что закономерность очевидная?

Тогда ещё пример:

«Был очень резвый парниша — взяли его без опыта вместо человека с опытом управления».

WTF?

Всё просто: на высоких грейдах повышают того, в кого верят. Того, кто точно справится

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

А ты уже понял, что важно твоему лиду?


Если пост зашёл, бахни 🌭. Тебе секунда — а я на следующей неделе заряжен буду деливерить ещё более сочный контент!
🌭129❤‍🔥3
🔥 Чёрная пятница в Algocode — скидка 50%

Доступ ко всем курсам сразу:

• System Design для собеседований
• Алгоритмы для собесов
• Графы: с нуля до PRO
• Алгоритмы для Яндекса
• Golang для собеседований

И это ещё не всё 👇

🎁 Так же скоро в подписке:
• Курс по поиску работы: "Стабильные отклики в нестабильные времена"
• SQL для собесов
• Java для собесов

Получается: платишь за весь контент сейчас и всё, что выйдет дальше получаешь на халяву!

⏳ Только до 31 декабря
Потом повысим цены

Оформи подписку, если устал получать отказы от рекрутеров и жаждешь карьерного буста в
https://algocode.io/community#subscriptions

P.S. Всем, у кого уже есть подписка могут перейти на более выгодный тариф, но только до 31 декабря
❤‍🔥14
Как объяснять графы на собесе без паники?

Есть 4 шага, которые интервьюер должен услышать
Не сказал — готовься к странным уточняющим вопросам

Касается задач на обходы (DFS/BFS)

- Откуда запускаем обход
- Когда вершину не посещаем
- Что делаем при обработке вершины
- Каких соседей вершины обходим

Без этих 4 пунктов тебя размотают быстрее клубка шерсти в лапах кошки


Пример на 30 секунд легко это исправить:

Задача: Нужно посчитать число компонент связности

Хороший ответ для рекурсивного DFS:
1) Запускаю DFS из каждой вершины, пропуская посещённые
2) Внутри DFS проверяю, что вершина ещё не была посещена
3) Помечаю её как посещённую
4) Обхожу всех соседей из списка смежности
После каждого запуска увеличиваю количество компонент


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

Ну и бахни 🌭 по-братски, а я пойду еще пост полезный напишу для тебя
🌭105
Беспроигрышные инвестиции в IT

Есть такая штука — инфляция. Пипец бесячая

Сегодня хата стоит 10 000 000, а 5 лет назад — 1 000 000.

Вот тебе и наглядный пример инфляции

Но инфляция есть не только денежная — она есть и в навыках, и в требованиях к кандидатам и т д

И при этом есть пара беспроигрышных инвестиций...

Да, в них тоже есть «инфляция», но, на мой взгляд, она происходит намного медленнее, чем в остальных навыках

Мой топ:
- Управление людьми
- System Design
- Алгоритмы и структуры данных


У меня лично «вложения» лежат во всех трёх — прям как гос-облигации: безопасно и вполне предсказуемо

Вот думаю во что бы еше вложиться более рисковое...

Может в крипто-аи-блокчейн технологии еше опыт заиметь 😂 (нет)
🌭23❤‍🔥8🤣4
Я устал поправлять кандидатов в Big O!

Вот простой пример: какая у него сложность?


def factorial(n: int) -> int:
if n <= 1:
return n
return n * factorial(n - 1)


Ну конечно, O(n) по времени и O(n) по памяти

Откуда память?

Рекурсия не бесплатна — каждый вызов кладётся в стек и занимает память.

---

Недавно давал задачку на графы — снова память оценили неправильно

Написал человек рекурсивный DFS с in-place пометкой посещённых вершин и думал, что память O(1)

Но рекурсия! Рекурсия!

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

Для тех, кто в сообществе algocode.io:
По-братски, вспомните раздел
Big O в рекурсии перед собесом
🌭37
Ключ к решению за 1 сабмит

Когда только ступал на тропу олимпиадной проги, то сразу хотел правильно решать за 1 сабмит

Идея 1 shot 1 kill очень манила

Но у меня всё никак не получалось… То ";" не поставлю, то corner case проморгаю

Пробовал даже несколько раз отправлять одно и то же решение. Ошибка же точно не у меня в коде 😂

Спустя пару лет собрал техники, которые сработали:

1. Отдельно проверять синтаксис, отдельно логику

2. Отдельно проверять общие случаи и отдельно corner cases

3. Дневник ошибок — выписывать причину ошибок в отправках, детально разбираться, почему не сработало, и потом агрегировать данные, акцинтируя бОльшее внимание повторяющимся проблемам

4. Запоминать паттерны, а не частные решения

5. Прорешивать повторно задачи


Делюсь с тобой, чтобы ты прошёл этот путь быстрее, чем я, и смог уйти намного дальше!

P.S. с тебя 🌭, с меня чёткие посты. Deal!
🌭101❤‍🔥5
Я чуть не у*бал своему продакту. Его спасло, что я на удаленке...

Короче, ситуация такая: у меня на работе много смежных команд и в целом объёмные цели у всего юнита

И отсюда произростает множество конфликтов

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

И есть константное напряжение

То что ты споришь и раскладываешь функциональность по сервисам становится фактором выживания команды

НО!

Это порождает множество когнитивных искажений:

- много чего ставишь под сомнение нужности
- стараешься всё время докапываться до сути в своей области, но не трогать чужие/трогать минимально (иначе просто не успеешь выполнить план свой)
- и т д

-----------

И после кучи задач что на мне висит продакт пишет

"Максон, ну вместе с XYZ создайте продуктовую задачу"

Я когда это увидел меня разорвало по всем частям...

Захотелось с вертухи ему засадить сообщение, что это его работа. Его спасла только удаленка...

Я прихожу с вопросом к продакту по функциональности — а он просит создать задачу продуктовую
(по сути это его работа)

-----------

Но я это сделал!

И знаете, я вообще не пожалел
Да, это не моя работа, но я могу это сделать и в долгосроке это играет мне на руку

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

Почему бы не обрести больше связей и респекта со стороны коллег

Эта мысль мне очень понравилась

Но прежде чем ее осознать я в мыслях прям несколько раз ему с вертухи прописал ему в челюсть

И я решил, что в 2026 буду влиять своими решениями на целый юнит

А для этого нужно отказаться от мелочной выгоды в моменте и смотреть не только на домен свой команды, но и смежных

Забавно как то, что раньше позволяло расти при переходе на следущую ступень тормозит...

P.S. Ну и если я какой-то текстик дочитываю до конца, то всегда бахаю 🌭
🌭123🤣2🍓2
Когда компании тяжело — для тебя открывается нереальное окно карьерных возможностей

В общем, бизнес сейчас страдает — НДС подняли, УСН порезали. Разом на все размеры бизнесов надавили)

Q1 2026 обещает быть тяжёлым, как и Q4 2025

И во всей этой суматохе можно выгодно выделиться среди остальных и урвать конкурентное преимущество

В целом сейчас тренд under performance — у всех сложное положение, давят новости и всё вокруг, дак еще и конец года

Работать непросто...

И общий performance снижается, как и мотивация

Если в такие времена работать просто нормально — кажется, что ты super top performer на фоне остальных (тебя всегда сравнивают при оценке с другими)

Если же времена хорошие и все перформят как не в себя — фиг ты вообще выделишься

Так что можно урвать свой шанс, пока все work-life balance настраивают


Я лишь подсвечиваю возможность, но решение всегда за тобой

P.S. А решение поставить 🌭 под постом ценится выше сусального золота
🌭100🤣3❤‍🔥1