6 Aug 2026, 04:54 UTC20 views2 reactionsread 8 August 2026 📈 From O(n²) to O(n): Проверка на дубликаты
📌 Задача
Определить, есть ли в списке повторяющиеся элементы.
❌ Наивное решение
def has_duplicates(nums):
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
if nums[i] == nums[j]:
return True
return False
Сложность: O(n²)
✅ Оптимизированное решение
def has_duplicates(nums):
seen = set()
for num in nums:
…
👍2
5 Aug 2026, 04:54 UTC22 views2 reactionsread 8 August 2026 🧠 Interview Thinking: «Не оптимизируй то, что не является проблемой»
📌 Задача
Проверить, является ли строка палиндромом.
👶 Как думает junior
Сразу пишет решение с двумя указателями:
def is_palindrome(s):
left, right = 0, len(s) - 1
while left < right:
if s[left] != s[right]:
return False
left += 1
right -= 1
return True
«Так эффективнее.»
🧠 Как думает сильный канд…
👍1🔥1
3 Aug 2026, 04:54 UTC25 views3 reactionsread 8 August 2026 ❌ Rookie Mistakes: list *= n с вложенными списками
На первый взгляд кажется, что ты создаёшь несколько независимых списков.
Но это одна из самых коварных ловушек Python.
❌ Ошибка
matrix = [[0] * 3] * 3
matrix[0][1] = 1
print(matrix)
🤔 Ожидание
[
[0, 1, 0],
[0, 0, 0],
[0, 0, 0]
]
💥 Реальность
[
[0, 1, 0],
[0, 1, 0],
[0, 1, 0]
]
🧠 Почему так?
Оператор * не создаёт новые вложенные спис…
👍3
3 Aug 2026, 04:54 UTC29 views3 reactionsread 8 August 2026 🧰 Code Cleanup: «Не используй list(), если можно сразу создать список»
❌ Плохой код
result = list()
for i in range(10):
result.append(i * i)
✅ Улучшенный код
result = [i * i for i in range(10)]
💥 Объяснение
В первом варианте список создаётся пустым, а затем постепенно заполняется.
Во втором сразу видно, что именно должно получиться.
⚡️ Правило
Если задача — создать новый список, а не изменять существующий,…
🔥3
23 Jul 2026, 16:04 UTC36 views3 reactionsread 8 August 2026 ⏱️ Big O Breakdown: рекурсивный Фибоначчи
def fib(n):
if n <= 1:
return n
return fib(n - 1) + fib(n - 2)
Классика из учебника. Выглядит элегантно. n — входное число.
Какая сложность по времени?
A) O(n)
B) O(n²)
C) O(2ⁿ)
D) O(n log n)
Правильный ответ: C
Три строки кода, а под ними — экспоненциальный взрыв.
Разбор
Каждый вызов fib(n) порождает два новых вызова: fib(n-1) и fib(n-2). Те — ещё по д…
🔥3
23 Jul 2026, 04:54 UTC28 views3 reactionsread 8 August 2026 🎭 Red Flag: изменение списка, по которому идёт цикл
Плохой пример
def remove_inactive(users):
for user in users:
if not user.is_active:
users.remove(user) # удаляем прямо во время итерации
users = [alice, bob, carol, dave] # bob и carol неактивны
remove_inactive(users)
print([u.name for u in users]) # ['alice', 'carol', 'dave'] ← carol выжила!
Код выглядит очевидно правильным…
❤3
22 Jul 2026, 16:04 UTC24 views4 reactionsread 8 August 2026 📈 From O(n log n) to O(n)
Задача
Дан массив из n чисел. Верни k наибольших. Обычно k сильно меньше n (топ-10 из миллиона).
Наивное решение
«Отсортирую и возьму хвост.»
def top_k(nums, k):
return sorted(nums, reverse=True)[:k]
Коротко и корректно. Но сложность — O(n log n): мы упорядочили весь массив, хотя нужны всего k элементов.
Проблема
Мы делаем гораздо больше работы, чем требует задача. Порядок остальных…
👍4
22 Jul 2026, 04:54 UTC27 views4 reactionsread 8 August 2026 ⚖️ This vs That: list vs tuple
«Кортеж — это неизменяемый список» — так отвечают почти все. Верно, но неполно: разница глубже, чем возможность менять.
Что делает list
Изменяемая последовательность. Можно добавлять, удалять, менять элементы:
items = [1, 2, 3]
items.append(4)
items[0] = 99 # ок
Что делает tuple
Неизменяемая последовательность. После создания — только чтение:
point = (1, 2, 3)
point[0] = 99 …
👍4
18 Jul 2026, 16:04 UTC37 views4 reactionsread 8 August 2026 ❌ Rookie Mistakes: except ловит не то, что кажется
try:
config = load_config()
value = config["timeout"]
result = process(value)
except KeyError:
print("В конфиге нет ключа timeout")
result = default_result()
Логика ясная: если в конфиге нет timeout — берём дефолт. Но однажды process внутри себя тоже кинет KeyError — по совсем другой причине. И этот блок его проглотит, напечатав неверное сообщен…
👍4
18 Jul 2026, 04:54 UTC25 views3 reactionsread 8 August 2026 🧠 Interview Thinking
Похоже на классику про акции, но правило одно меняет всё — и на этом ловят.
Задача
Дан массив prices — цена акции по дням. Теперь можно совершать сколько угодно сделок: покупать и продавать много раз (но держать не больше одной акции одновременно). Максимизируй суммарную прибыль.
Пример: [7, 1, 5, 3, 6, 4] → 7.
Как думает junior
«Много сделок… надо найти лучшие моменты входа и выхода, переб…
🏆3
17 Jul 2026, 16:04 UTC29 views4 reactionsread 8 August 2026 🧰 Code Cleanup: ручная проверка ключа → dict.get и setdefault
Плохой код
# достать значение с дефолтом
if "timeout" in config:
timeout = config["timeout"]
else:
timeout = 30
# накопить в словарь списков
if key in groups:
groups[key].append(value)
else:
groups[key] = [value]
Работает. Но каждое обращение к словарю — это четыре строки на «а вдруг ключа нет». Проверка in, потом снова доступ по тому ж…
👍4
17 Jul 2026, 04:54 UTC27 views3 reactionsread 8 August 2026 🧠 Что выведет код
x = [1, 2, 3]
def modify(lst):
lst = lst + [4]
def mutate(lst):
lst.append(4)
modify(x)
print(x)
mutate(x)
print(x)
Варианты:
A) [1, 2, 3, 4] и [1, 2, 3, 4]
B) [1, 2, 3] и [1, 2, 3, 4]
C) [1, 2, 3, 4] и [1, 2, 3, 4, 4]
D) [1, 2, 3] и [1, 2, 3]
Правильный ответ: B
Одна функция «меняет» список, другая — нет. Почему?
Разбор
Python передаёт аргументы не по значению и не по ссылке, а по…
🔥3
Showing the 12 most recent of 20 posts we hold for @python_prosto1. View and reaction counts are the latest single reading for each post, not a live figure, and a recent post is still accumulating both. A view count marked ≈ was rounded by Telegram before we ever saw it — t.me prints views in full below 1,000 and to three significant figures above, so ≈1,200,000 means somewhere between 1,150,000 and 1,249,999. Unmarked counts are exact. Text is reproduced from the public post preview and truncated for length.