Подборка практических задач с собеседований #1
HTML-код
- Опубликовано: 6 янв 2023
- Небольшая подборка лайф-коддинга с различных собеседований на позиции middle/senior python developer.
00:00 - throttling декоратор
32:57 - retry декоратор
42:56 - сжатие строк
51:40 - multiarg декоратор
Как вам такой формат с подборками? Или лучше стандартные вопросы с собесов выкладывать?)
Хороший формат, в паре с теорией полезно
супер
Супер, и то и то заходит!
Согласен с другими комментаторами. Хороший формат. Тоже нужен.
Спасибо за видео.
Мне нравиться я думаю всем это полезно . Можно миксовать если есть материал для этого . Спасибо .
Парень ты просто красавчик. Реальных собесов вроде ни у кого нет , кроме тебя . спасибо .
это вообще нормально что я все эти задачи на джуна решал
спасибо что выкладываешь)
Прикольные задачи. Спасибо
Круто, много интересного
классные задачи
Предлагаю такой подход к первой задаче (сделал более адванст версию)
У нас есть фабрика, которая может сделать декоратор под разные лимиты.
def limit_function_fabric(limit):
def limit_function(func):
times = []
def wrapper():
nonlocal times
if len(times)>=limit:
# Clear extra items (no need store more than limit)
times = times[-limit:]
if time.time()-times[-limit] < 1:
print('Skip function')
return
func()
times.append(time.time())
return wrapper
return limit_function
@limit_function_fabric(4)
def func():
print('Executed')
func()
func()
func()
func()
func()
func()
time.sleep(2)
func()
func()
func()
func()
def dec_f(func: Callable) -> Callable:
count = 0
last_call = time.time()
def inner_func(*args, **kwargs):
nonlocal count
nonlocal last_call
if time.time() - last_call < 3 and count >= 3:
print(f'Вызов функции пропущен, {func.__name__}')
return
func(*args, **kwargs)
count = count + 1 if count < 3 else 1
last_call = time.time()
return inner_func
Все задачи очень простые, но как их решать именно на собесе загадка)
Я уже кидал год назад задачку от Сбера, привожу один из ответов, который на данный момент не был описан. "# Задача: найти 1 уникальное значение, дубликатов всегда по 2: values = [1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6]"
Как многие догадались, можно и через dict, counter, дополнительные структурки для временного хранения (в тот же список добавлять элемент, если его в списке нет, убирать если есть), и всё идёт к вопросу алгоритмической сложности. Сам виноват с условием, что не указал про элементы - исключительно цифры (со строками не сработает)
Один из ответов - использовать xor (^, крышечку):
values = [1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6]
def find_unique(values: list) -> int:
result = 0
for elem in values:
result = result ^ elem
return result
print(find_unique(values))
Прикол данного решения заключается в том, что написав такой ответ можно показать себя "шибко умным" в контексте собеса на определённую должность, и из-за этого не пройти, т.к. написанный вами код должен понимать другой разработчик, а не все вспомнят про XOR. Так что необходимо будет хотя бы обозначить этот момент при прохождении интервью
from datetime import datetime
def time_required(func):
calls = []
def wrapper(*args, **kwargs):
current_call = datetime.now()
if len(calls) >= 3 and (current_call - calls[-3]).seconds < 1:
print('skip')
return
del calls[:-2]
calls.append(current_call)
func(*args, **kwargs)
return wrapper
Первую как-то так накидал. Надо, конечно, нормально тестить, но вродь работает :D
жееесть, лучше не пиши так на собесах)
@@nda861 почему?)
@@nda861 тот же вопрос, почему?)
если распишешь конструктивно, буду благодарен
def throttle(fn):
stack = [0, 0, 0]
def wrapper(*args, **kwargs):
if (time.time() - stack[0]) < 1:
return
fn(*args, **kwargs)
stack.pop(0)
stack.append(time.time())
return wrapper
Мне кажется, так по-красивее будет, не считая .pop(0) + .append(), возможно что-то более лаконичное есть
Но это я вне собеседования Лев Толстой, а на собеседовании поплавился бы точно также)
за 10 минут, стронг мидл
Полчаса веселился когда просматривал мучения с первой задачей :)
Вот моё решение, если кому интересно :)
import time
INTERVAL_TIME = 0.34
def foo():
if time.time() - foo.time_call > INTERVAL_TIME:
print("...")
foo.time_call = time.time()
foo.time_call = time.time()
@@user-xg8qt8ky1s Если я правильно понял вашу идею, то во-первых, там наверное должен быть знак меньше, а во-вторых, вроде будет немного не то, что требуется по условию. Получается у вас ограничение на вызов функции раз в 1/3 секунды? Но мы же можем за 0.01 вызвать ее хоть все 3 раза, главное чтобы 4 вызов в течение секунды не прошел)
@@python_interview Знак правильный. По условию меня "биржа" не должна забанить. И сделаю я для этого обёртку над функцией или нет. Кстати я бы на месте собеседующего поставил бы тебе большой минус за использование декоратора ;)
@@user-xg8qt8ky1sрешение не оптимальное т.к. даже при возможности за долю секунды выполнить функцию 3 раза мы заставляем ждать все вызовы 0.3 секунды. Во вторых чем тут декоратор вас не устроил если есть кейс того что сервис принимает 3 вызова в секунду то возможно и на другие функции пригодится декоратор к тому же собеседующий уточнил что лезть в основной код функции не хочется. если интересует моё решение то вот декоратор
def throttle(func):
stack = [time.time(), time.time(), time.time()]
def inner(*args, **kwargs):
if stack[0] < time.time()-1:
func(*args, **kwargs)
del stack[0]
stack.append(time.time())
else:
print('throttle')
return inner
Извените, Я бы хотел узнать ваше мнение.
Как вы относитесь к накрутки опыта в разработке?
Если другие варианты?
У меня сейчас 2 резюме и единственное, что в них различается, это количество опыта, но на одном 2 отлика (о опыта), а на другом 26 (1.6 опыта).
Зависит от ситуации. Если у тебя год опыта, но знаний на 3 года, то не будет ничего плохого, если ты эти 2 года накрутишь, чтобы пройти отбор в лице HR. Если ты знаешь больше своего опыта, то работодатель не расстроится)
Другое дело, если знаний на 1 год, а пишешь, что опыт 5 лет. Тогда тут тебя раскроют на собеседовании, и получится, что зря потратил время интервьювера.
@@python_interview спасибо за ответ. Я не хочу накручивать более 2 лет, это не очень:)
Я просто хочу сделать своё резюме, где 1.6 - основным и подаваться по нему. Не очень кайфово, когда проходишь интвью во 'фейку', а по реальному тупо не зовут.
Как вы считаете это можно сделать?)
Извените за обилие текса. Спасибо!
@@quansumonner отчаянные времена требуют отчаянных мер) не вижу в этом чего-то криминального, но и не мне судить
@@python_interview Cпасибо, мне действильно было это интересно,
Последний вопрос, вы бы так сделали?
@@quansumonner ну я несколько месяцев прибавлял как-то к опыту, чтобы солиднее выглядело)
Закину сюда задачку от Сбера на будущие поколения:
# Задача: найти 1 уникальное значение, дубликатов всегда по 2
values = [1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6]
def find_unique(values: list) -> int:
pass
print(find_unique(values))
Я бы через Counter решил
@@python_interview Что если в словарь добавлять ключом которого будет 2:2, 1:2... 4:1, найти ключ значение которого 1?
@@snobou12 цикл по d.items() и проверка значений?
reduce по исключающему или, только как до этого догадаться во время собеса если изначально не знать). Еще по наркомании можно отсортировать список и итерироваться беря по два элемента их сравнивая. Проблема алгоритмических задач - не знаешь( не саму задачу, а фишку помогающую ее решить: черепаха-заяц, метод двух указателей и т.д.) не решишь, они на знание а не логику.
лучше уж поздно, чем никогда)
values = [1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6]
def find_unique(values: list) -> int:
d = {}
for i in values:
if i in d:
d[i] += 1
else:
d[i] = 1
for k, v in d.items():
if v == 1:
return k
print(find_unique(values))
Скорость кода o(n), использованы хэш-таблицы, сбер явно оценит))
2:15 Сильно затянута постановка задачи. И после встречного вопроса ещё раз то же самое. Пять минут формулировать вопрос это как то много... ;) Не хватает живости диалога