Это не сеньер явно. 3я задача просто уровень джун джун. Хранить 2 массива, целевой и с отсортированными уникальными значениями, любой реально работающий джун это сделает . 2я хосапде, проверка наследования эксепшена. До перемотки видел что там было if т.е, что произойдет если туда в параметр, а как я понял это массив, передадут 3е или n значение?). Первую ничерта не понял, но видимо потому что питон вижу 1й раз. Мне жаль рынок ИТ если такие менторят людей в интернете и их слушают. Теперь понятно почему хр не могут найти людей
то что что то существует в пайтоне - не значит, что оно зарезервировано object - не зарезервировано, но объект с таким именем существует, но назвать переменную так можно in, for, class, def, async, await, return, and, or - зарезервированны, такими именами не получится назвать переменные
@@ogone4ek880 Если вы используете object как имя переменной, вы затрудняете доступ к встроенному классу object в текущем контексте. Это может привести к путанице и ошибкам, особенно если ваш код зависит от базового функционала этого класса. Это фундаментальная штука и в коде она была неспроста. Основа основ ООП.
Так много комментариев, что задачи легчащие и не тянут даже на стажера и так мало комментариев, что третья задача решена не верно, точнее не для всех случаев) Видимо эти комментаторы только во сне разработчики)
Я немного не понял, но получается что в min_nums будут добавляться не все числа? разве за этим не последует ситуация когда get_min даст неверное значение, вроде 4 5 1 1, список минимумов заполнится единицами, а когда их обе вытолкнут, то get_min ничего не вернет?
Какой джун ? Серьезно ? Хорошо давай задачу для мидл. Я считаю что на позицию джун одолжен быть один вопрос готов ли ты уволится через месяц если не справиться. Все какие задачи и лайвкодинг . Понятно что пару вопросов надо задать чтоб понять в теме человек или нет .
Смотря для кого. Олимпиадник с такими задачами на изи справится, сеньер, у которого последние 5 лет было решение реальных задач, а не этого бреда, будет закономерно тупить.
Третья задача, которая "Самая сложная", на Сишарпе можно написать оч лего и быстро, минут за 10. Этому меня учили на 1 курсе, а если уже быть Мидл или Джуном, который закончил обучение это максимально изи. Если я будучи на Втором курсе, посмотрел на условие и понял, что в Шарпе "Самую сложную задачу" смогу написать за минут 15-20, т.к. Я еще не Джун и не Мидл
Ну я честно не понимаю две вещи: 1. Каким образом человек которого заявляют как сеньора так долго (и так плохо) решал эти задачи 2. Почему после такого собеса человека (судя по заявлениям в видео) взяли, это же даже не уровень стажера
@@artemshumeiko меньше, врать не буду. Но с таким уровнем прохождения алго-задач даже на стажировки в биг тех не берут, там банально развернут на первом этапе. Я понимаю что алгосы это не то что показывает уровень разработчика, но если бы собеседующие так считали - зачем они бы дали вообще эту задачу, да еще и в конце (в конце дают задачи посложнее обычно)
3:09 Всегда хочеться треснуть чем-то тяжелым тех кто в одну строку пишет много операторов, как это в строке 2 и 9. Код в первую очередь должен быть визуально легко читаем, потому что читаем код мы чаще чем пишем, экономия количества строк не дает преймуществ, кроме демонтрации умственных отклонений автора подобного кода.
Для меня сложно было второе. В третьем сразу понял что нужно параллельно сортированный список создавать при инициализации и добавлять в нужное место новый при пуше
Вы реально не знали ответ на эти задачи будучи синьором? Или спецом тупили чтобы не спалил интервьюер? Если первое, то получается такие сложные вопросы или вы не такой хороший синьор?! И как проходить такие собесы челам без опыта?!
По поводу "И как проходить такие собесы челам без опыта?!" - А как проходят собеседования для FANGа ? Есть разные видоскики на Ютубе, где люди рассказывают как они по много месяцев прорешивали задачи на LeetCode + там же можно изучать чужие решения. Через год такой практики вы тоже сможете быстро находить решения под такие задачки на собесах - в подсознании уже накопятся типовые алгоритмические решения.
Пару комментов: задача 2. 1. Полагаю не стоит использовать isinstance, т.к. есть риск получить проблемы с наследованием при расширении списка передаваемых эксепшенов (например, передали еще LookupError, lambda: print(3)) и получили не ожидаемое поведение). type проверит на точное совпадение. 2. Вызов ex[1]() производится без параметров, что в случае IndexError("bar") выбросит missing required positional argument. Полагаю, это проблема постановки задачи и некоторой не внимательности при выполнении. 3. raise e стоит вынести из условия, иначе ломается логика, если выбрасывается эксепшн не переданный в списке. задача 3. 1. Использование list говорит, что у нас О(1) будет не совсем честная. Если докапываться, то какой-нибудь связный список - самое то. 2. Для второго списка за счет чуть большего количества памяти можно поддерживать более простую логику (храним список минимумов). def push(self, num: int) -> None: self.stack.append(num) self.min_nums.append(min(lst[-1] if lst else num, num)) def pop() -> int: self.min_nums.pop() return self.stack.pop()
2 месяца лета не зря... 1 задачу я решил, на второй запутался, но по ходу событий понял, что надо было сделать, а в 3 я сразу понял, что надо было сделать, да и сделал
@@funtickgd9502 Помоги, пожалуйста. Вот тоже из скачанных курсов получил базу, но а щас я хз, че мне делать.. Хочу на веб-разраба пойти и по идее до изучения самого django нужно просто решать задачи и так далее, но я вообще не понимаю, где можно было бы подчеркнуть действительно важные и полезные знания ,а где практикой их закрепить.
Push все равно кривой получился. Если до конца списка делать pop, то с какого-то момента не будет значений из упорядоченного списка. Всё из за условия добавления
@@PeterSidoroff там фича в том, что добавление в упорядоченный массив у тебя происходит только при пуше меньшего элемента, т.е. push(1), push(2), push(3), pop() -> 1, pop() -> None т.к. 2 и 3 тупо не добавлялись, оба гения сидят(как сделать пуш за О(1) если там придется по нормальному по всему массиву проходиться чтобы его в нужное место воткнуть не представляю)
в защиту автора видео хочу сказать, что на собеседовании очень сильный стресс и даже такие легкие задачи как первая могут вогнать в ступор, так как очень много нервов мешает думать. Это надо прокачивать скилл прохождения собеседований, чтобы на них не переживать
Первые две задачи без комментариев - там ничего сложного. 3-я задача встречалась в нескольких курсах по алгоритмам и структурам данных, поэтому если знаешь, то реализовать ее тоже не составляет большого труда.
Кому интересно, вот такой код у меня получился на последний вопрос. class Stack: def __init__(self): self.stack = [] self.pref_min = [] self.current_min = None def pop(self): self.stack.pop() self.pref_min.pop() self.current_min = self.pref_min[-1] def push(self, num): self.stack.append(num) self.current_min = min( self.pref_min[-1], num) if self.pref_min else num self.pref_min.append(self.current_min) def top(self): return self.stack[-1] def get_min(self): return self.current_min a = Stack() for i in [10, 2, 5, 4, 6, -1]: a.push(i) a.pop() print(a.top())
эээ а не проще ли через словарь созданный из типов исключений и обработчиков - хватем исключение e и проверяем функцией из первого задания if match:=get_first_matching_object(pred=lambda x:x in ourdict,[type(e)]+list(type(e).__bases__)):match() raise e?
Бл как надоели люди которые пишут что это просто нереально легко было все. Вы сидите смотрите видео, говорят ответ, вы в голове прокрутили и ответили про себя лучше и это изи. А вы отвечайте сами сперва, а потом слушайте ответ. 90 процентов кто писал «изи на все ответил» сразу откиснут
Я почему то думал что Джунам сложнее вопросы задают, я знаю почти всё что было на собесе из видео, но я до сих пор не нашел работу, может я что-то делаю не так. Хотя у меня и собеса никогда не было :). Видео придало мне уверенности в своих знаниях, надеюсь скоро найду работу
А на какое количество вакансий ты отправлял резюме? Сейчас на джунов высокая конкуренция, поэтому надо просто часами сидеть на сервисах поиска работы и закидывать своё резюме везде где можешь
Да... с каждым годом требы к Джунам увеличиваются в геометрической прогрессии😅😅 .... Страшно представить чем занимаются Мидлы и Сеньоры😅😅... Прямо в офисе чилят и эксплуатируют бедных Джунов😭😭😭
Посмотри документацию pydantic, раздел "Handling custom generic classes", где рядом есть плашка warning с текстом "This is an advanced technique that you might not need in the beginning". Мидлы это те, кто такие штуки применяет, а сеньоры - кто придумывает.
Посоны, я senior/architect, на всё бОльшее количество проектов джунов даже страшно брать потому что некогда исправлять ошибки, учить или ждать пока сам научится. Требы к знаниям не растут потому что senior всегда должен был знать _всё_, а вот требы к срокам да (чем дальше, тем быстрее надо работать).
нет) порог входа с каждым разом всё выше, мб раньше джунам нужно было ложкой с первого раз в рот попадать, и их уже брали доучиваться, но сейчас ищут самостоятельных спецов, 2 и 3 задачи вполне адекватные, проверяют твои знания в ООП (не совсем), алгоритмах и структурах данных и основах языка, декораторы используются везде, с ними тоже нужно уметь работать уже на начальных стадиях
полтора гола ежедневной учебы и 100к ваши. На самом деле пох сколько предлагают 50, 70, 100. Если компания норм, то сам факт влиться в структуру и уже расти по грейду это и есть основная цель.
@@saitaro круглые скобки это не лист компрехеншен а генератор эскпрешн, ленивые вычисления, некст один раз выполнится да и все, дальше эвальюейтится ничего не будет(но понятное дело, что само условие будет проверяться для каждого элемента до первого трушного)
вообще не понял третью задачу. Первое что мне пришло в голову - создать связный список. Добавление - переназначение указателя на вершину на новый, удаление - переназначение указателя на следующий, топ - указатель уже указывает на нужное, get_min можно искать при каждом добавлении элемента в стек или при его удалении(если уадлили минимальный, то нужно найти следующий минимальный), либо если по памяти нам все равно, то создать multi_set и там уже изи все хранить. первое что пришло в голову
Третье задание примерно на уровне ЕГЭ по информатике. Весьма доступно. Если учащийся сам смог найти решение егэшных задач, а не тупо зубрил шаблонные готовые решения, то третья задача ему вполне должна быть по силам.
🎯 Key points for quick navigation: [00:52] 🛠️ Нехватка типизации и неясность роли предиката, который выглядит как функция из-за своего вызова позднее. [01:19] ⚠️ Некорректное использование изменяемого объекта в качестве значения по умолчанию для аргумента функции. [01:45] 💡 Удаление избыточных строк и оптимизация конструкции для создания объектов. [02:31] 🤔 Функция фильтрует массив объектов, возвращая первый подходящий элемент. [04:04] ⚡️ Оптимизация функции для завершения работы при нахождении первого подходящего элемента. [05:03] 💡 При вызове функции со списком объектов, функция будет возвращать объект, соответствующий первому элементу списка, или None, если подходящего элемента нет. [06:35] 📝 Худшая временная сложность функции O(N), где N - количество элементов в массиве, а лучшая - O(1), если подходящий элемент находится в начале массива. [07:02] 🤖 Длина выполнения алгоритма равна длине N списка. [07:17] 🌟 Задача на собеседовании была легкой, но потребовались подсказки интервьюера. [07:31] 🎁 Получите шпаргалку по алгоритмической сложности в Telegram-канале. [08:11] 🌐 Платформа Solvit поможет вам подготовиться к техническим собеседованиям. [08:55] 🚀 Обязательно пройдите по ссылке в описании и воспользуйтесь платформой Solvit. [09:08] 👨💻 Задача на собеседовании: написать декоратор с параметрами. [10:38] 📝 Функция, принимающая аргументы функции, может использовать ключевое слово args. [12:58] 🤔 Если вы не знаете, как ответить на вопрос, попробуйте начать писать код и решение придет к вам по ходу дела. [13:43] 🤖 Exception в Python может быть от базового класса Object [14:17] 💡 Чтобы обработать исключения, можно использовать конструкцию try...except [14:48] 👀 Для отладки удобно использовать декоратор из функции logging.debug() [16:05] 📝 Сложная задача на проектирование класса, требующего оптимизации алгоритмов [16:45] 📘 Написание класса с методами push, pop, top и getMin за O(1) [17:20] 🤔 Для поиска минимального элемента нужно хранить отдельную переменную и обновлять ее при каждом push [18:18] 💡 Для поиска минимального элемента можно использовать дополнительную переменную, хранящую второе минимальное значение [19:56] 💡 При удалении элемента нужно пересчитать минимальное значение [22:15] 🤔 Для хранения минимального значения одной переменной недостаточно [22:45] 📝 Для обновления минимального значения нужно найти максимальное из двух значений [25:10] 🗣️ Не бойтесь делиться своими мыслями, даже если они ошибочные. Открытость и готовность работать в команде очень важны. [26:01] ⚡️ Стек может быть использован для реализации работы с неограниченным количеством переменных. [27:43] 📈 Возрастающая последовательность чисел может быть использована для создания структуры данных, где новое число добавляется только если оно меньше предыдущего. [28:36] 💪 При удалении элемента из возрастающей последовательности можно не учитывать элементы, которые больше или равны удаляемому. [29:12] 🔄 Элементы в последовательности могут повторяться, что следует учитывать при реализации структуры данных. [30:08] 📝 Для реализации стека можно использовать массив с последним элементом, который будет соответствовать минимальному значению. [32:10] 🗣️ Задавать грамотные вопросы интервьюеру также важно, как и решать задачи. Это показывает вашу заинтересованность и адекватность. Made with HARPA AI
На питоне не пишу, знаю только школьную программу, поехали. 1. Получить первый объект, соответствующий условию предиката. Она создает список, прогоняя объекты через предикат, и возращает первый элемент, если список не пустой 2. Без понятия :D 3. честно говоря, мне такая задача попадалась в одном курсе. Я просто использовал словарь(ключ: число, значение: количество чисел) и стек одновременно: ко всем новым в стеке числам в словаре прибавляется единица. И когда нужно получить минимальный элемент, просто выбираем первый элемент словаря Получается, 1 - правильно, 2 - неправильно, 3 - правильно.
не понял, почему нельзя просто def get_min(self): return min(self.stack) все остальные методы изменяют данные self.stack и метод всегда будет возвращать данные согласно актуальному стеку. Либо я не понял задачу
@@Артем-п6ф9эчувствую, в 2025 от джунов (по крайней мере в вебе) будут требовать написать полноценное приложение-чат (при этом не просто чат, а асинхронный real-time чат), который полностью заменит чат в каком-нибудь вк, так еще и с разделением на личные сообщения и беседу, и это в качестве тестового задания, но платит таким спецам будут те же 50-80к; а уже в 2027 такое задание на джуна тянуть не будет. Люди всё больше идут в программирование, python один самых популярных языков (если не самый), конкуренция на позицию джуниор огромная, так как все торопятся выйти на работу. Зарплаты растут медленно, уровень понимания и количество знаний должны быть всё глубже и больше, ну и помимо этого увеличивается требуемое количество сайд скиллов (по типу git, но конкретно к нему нет претензий, просто для ясности пример)
@@Артем-п6ф9эзачем "как"? Просто написать. Причем чтобы к концу лайв кодинга количество пользователей было больше, чем в ТГ. Это на Джуна. На стажёра - больше, чем в Фейсбук
Последняя задача не до конца решена. 1. Есть бы сделаем push(3), push(6), push(7), pop(3) и запросим get_min, нам отдаст IndexError, хотябы по идеи должен отдать 6. Мы никак не сможем добиться O(1) в get_min, за исключением, если будем постоянно держать в get_min отсортированную коллекцию, но тогда у других операций увеличится Time Complexity.
сможем, например, вот так: class Stack: def __init__(self): self.stack = [] self.mins = [] def push(self, n: int): self.stack.append(n) self.mins.append(min(self.get_min(), n) if self.mins else n) def pop(self) -> int: self.mins.pop() return self.stack.pop() def top(self) -> int: return self.stack[-1] def get_min(self) -> int: return self.mins[-1] и да, решение на видео с ошибкой, в некоторых случаях неправильно сработает.
"One Stack (stack of pair value,minvalue):" def pop(O):return O.s.pop()[0] $$$ def top(O):return O.s[-1][0] $$$ def get_min(O):return O.s[-1][1] $$$ def __init__(O): O.s=[(float('inf'),float('inf'))] $$$ def push(O,v): O.s.append(v,min(v,O.get_min()) # храним в стеке сами значения и его текущий минимум
"One Stack (stack of pair value,minvalue):" def pop(O):return O.s.pop()[0] $$$ def top(O):return O.s[-1][0] $$$ def get_min(O):return O.s[-1][1] $$$ def __init__(O): O.s=[(float('inf'),float('inf'))] $$$ def push(O,v): O.s.append(v,min(v,O.get_min()) # храним в стеке сами значения и его текущий минимум
По-моему некорректно говорить, что в худшем случае О(n), а в лучшем O(1), O вроде описывает имеено поведение в среднем (но надо посмотреть, сходу что-то не находится)
O-нотация характеризует верхнюю границу. Например алгоритм быстрой сортировки в худшем случае (при неудачном выборе опорных элементов) может выполниться за O(n*n), но верхняя граница в среднем находится на O(nlogn).
@@artemshumeiko У меня не веб разработка (хоть я и знаю RoR), но если тезисно, то интервью состоит из двух частей. 1) Теория: rest, soap, sql, ci/cd, git и тд. Практика: лайвкодинг по задачам. Задачи от элементарных, типа "найти ошибку в простейшем методе" или "что вернет этот метод", до сложных на ООП с подковырками, где в классе используются миксины и модификаторы доступа. Крутого кандидата могу и по метапрограммированию спросить, и попросить поднять простейший кастомный фреймворк для АТ, но джунов я не собесил, не было нужды, всегда мидлы и выше. З.ы. НИКОГДА не спрашиваю теорию тестирования типа "чем смок отличается от санити", "артефакты тестирования" и прочую чепуху. Это вопросы для ручников-стажеров, а для AQA и SDET такие вопросы == по глупости, как и "кем себя видишь..." )))
@@artemshumeiko У меня не веб разработка (хоть я и знаю RoR), но если тезисно, то интервью состоит из двух частей. 1) Теория: rest, soap, sql, ci/cd, git и тд. Практика: лайвкодинг по задачам. Задачи от элементарных, типа "найти ошибку в простейшем методе" или "что вернет этот метод", до сложных на ООП с подковырками, где в классе используются миксины и модификаторы доступа. Крутого кандидата могу и по метапрограммированию спросить, и попросить поднять простейший кастомный фреймворк для АТ, но джунов я не собесил, не было нужды, всегда мидлы и выше.
@@alexander_gkс каких пор миксины, модификаторы доступа и вопросы по метапрограммированию это уровень выше слабого стажера (Что-то типа стажер- -)? Если добавить туда хорошее (± глубокое) понимание асинхронного программирования и отличия асинхронности от многопоточности, многопроцессорности, а для практики добавить задание с написанием функции с использованием asyncio, то, базару ноль, кандидат тянет на стажера, можно даже деньги ему платить, 25-30к
@@TheWorld-hs1hf с каких пор описанное тобой - это стажёр? Стажёр - это когда ты пишешь в сознании сразу двоичный код и передаешь его из нейронов в процессор.
Кажется последняя задача решается линкедлистом с указателем на последнюю ноду, а в ноде с указателями на предыдущую и минимальную. И не надо создавать второй лист
Тогда вам нужен кастомный ЛЛ с двумя указателями. Можно упростить и держать минимальное значение в каждой ноде вместо указателя. Но это будет занимать больше места.
Если это JUNIOR то у меня знания zero.
Ну я бы за 20 минут решил бы задачу, в принципе надо понять задачу
За 2 месяца этого лета у меня прогресс, я решил 1 задачу...
Нормально если ты не изучал каждый день по 8 часов@@funtickgd9502
и таких, как ты, 99% в откликах
@@uvwzyx Каких в откликах?
видео придает уверенности, что сеньоры тоже тупят на собеседовании джуна
Он тупил спецом ))
Это не сеньер явно. 3я задача просто уровень джун джун. Хранить 2 массива, целевой и с отсортированными уникальными значениями, любой реально работающий джун это сделает . 2я хосапде, проверка наследования эксепшена. До перемотки видел что там было if т.е, что произойдет если туда в параметр, а как я понял это массив, передадут 3е или n значение?). Первую ничерта не понял, но видимо потому что питон вижу 1й раз.
Мне жаль рынок ИТ если такие менторят людей в интернете и их слушают. Теперь понятно почему хр не могут найти людей
Это ж из разных сказок джин и сеньор Помидор
@@Rulezzz3 это канал просто принадлежит недосеньору. Нормальный сеньор на собесе не тупит.
причем конкретно :))))
омг) главный скилл на собесах это внимательно слушать вопросы и стараться отвечать именно на них
Object в Питоне же зарезервированно, и можно было бы сказать, что не корректно использовать такое название. 😊
то что что то существует в пайтоне - не значит, что оно зарезервировано
object - не зарезервировано, но объект с таким именем существует, но назвать переменную так можно
in, for, class, def, async, await, return, and, or - зарезервированны, такими именами не получится назвать переменные
зарезервирован object, но не Object
@@ogone4ek880 да, но это считается плохой практикой
@@ogone4ek880 Если вы используете object как имя переменной, вы затрудняете доступ к встроенному классу object в текущем контексте. Это может привести к путанице и ошибкам, особенно если ваш код зависит от базового функционала этого класса. Это фундаментальная штука и в коде она была неспроста. Основа основ ООП.
@@unnme2721 и че, я сказал что это незарезервированное имя, а не то что можно свободно так переменные называть
Так много комментариев, что задачи легчащие и не тянут даже на стажера и так мало комментариев, что третья задача решена не верно, точнее не для всех случаев)
Видимо эти комментаторы только во сне разработчики)
Я вот заметил, но правильное решение за константное время так и не придумал. Интересно, а на собесе это заметили или нет?
Первая легко, третья легчайше для олимпиадника, просто дефолтный стек с префиксным минимумом. А для второй нужно синтаксис подучить
Да тут ЕГЭ уровень
задача с минимальным элементом в стэке - огонь)
это куда такие собесы? очень хотелось бы
это какой-то новый уровень троллинга)
Почему? Слишком просто для джуниора? Если да, то зачем джуниору знать больше?
@@TheWorld-hs1hf 😂😂😂😂😂
Я немного не понял, но получается что в min_nums будут добавляться не все числа? разве за этим не последует ситуация когда get_min даст неверное значение, вроде 4 5 1 1, список минимумов заполнится единицами, а когда их обе вытолкнут, то get_min ничего не вернет?
Отлично. Спасибо за собеседование. Покажешь на Ютубе ещё одно с лайв кодингом?
на 12:09 копирует и спрашивает у нейросети :)
Честный отзыв! Если честно не тянешь на senior разработка очень слабо, на middle специалиста еще можно !
Сеньор - это не про классное решение алгоритмических задач с собеседования
Решил 1 и 3 (сириус курсы спасибо), декоратор плохо сел в память
Когда решалась вторая задача, увидел обучающую структуру Сергея Балакирева по декораторам. wraps, wrapper, res))
Не могу не спросить)) а что за тема редактора которым они шеряться?
Monokai чуть другой, этот приятнее
У меня только на одну задачу ушло бы 30-40 минут. Сколько бы я не нарешивал эти задачи, я не могу решать их быстро
Какой джун ? Серьезно ? Хорошо давай задачу для мидл. Я считаю что на позицию джун одолжен быть один вопрос готов ли ты уволится через месяц если не справиться. Все какие задачи и лайвкодинг . Понятно что пару вопросов надо задать чтоб понять в теме человек или нет .
Так , все, иду работать в пятерочку . Чему я научился за месяц хз.
Если это Senior то в отличие от Джуна воспользуется chat gpt
Ты же не синьор явно
третья задача развалится, когда в список залетят два одинаковых числа и оба будут минимальными
Спасибо за ваш контент! Очень познавательно и полезно! Продолжайте в том же духе!
Очевидно, про принцип kiss в этой конторе не слышали.
По голосу интервьювера, ему лет 17-19, если это так, мне значит немного стыдно 😢
Не, точно больше
можно бригаду. это спецом сеньор так тупит? или реально? или постановка?
Смотря для кого. Олимпиадник с такими задачами на изи справится, сеньер, у которого последние 5 лет было решение реальных задач, а не этого бреда, будет закономерно тупить.
А нельзя было написать Filter(predicate, object) ?
И что делать потом с этим фильтром?
@@saitaro что-то аля try next(objects) except StopIteration
Жестко. Я ни одной не знаю😢
Ты не один друг, я тоже почувствовал себя тупым
1 k евро ? Пзд 😂
Третья задача, которая "Самая сложная", на Сишарпе можно написать оч лего и быстро, минут за 10. Этому меня учили на 1 курсе, а если уже быть Мидл или Джуном, который закончил обучение это максимально изи. Если я будучи на Втором курсе, посмотрел на условие и понял, что в Шарпе "Самую сложную задачу" смогу написать за минут 15-20, т.к. Я еще не Джун и не Мидл
Спасибо тебе большое, бро. Ты делаешь глупых людей как я чуточку умнее.
Ну я честно не понимаю две вещи:
1. Каким образом человек которого заявляют как сеньора так долго (и так плохо) решал эти задачи
2. Почему после такого собеса человека (судя по заявлениям в видео) взяли, это же даже не уровень стажера
Вам виднее, наверняка 500к зарабатываете?
@@artemshumeiko меньше, врать не буду. Но с таким уровнем прохождения алго-задач даже на стажировки в биг тех не берут, там банально развернут на первом этапе. Я понимаю что алгосы это не то что показывает уровень разработчика, но если бы собеседующие так считали - зачем они бы дали вообще эту задачу, да еще и в конце (в конце дают задачи посложнее обычно)
Кстати в защиту собеседуемого стоит заметить что с декоратором вроде быстро все получилось, мое почтение
3:09 Всегда хочеться треснуть чем-то тяжелым тех кто в одну строку пишет много операторов, как это в строке 2 и 9. Код в первую очередь должен быть визуально легко читаем, потому что читаем код мы чаще чем пишем, экономия количества строк не дает преймуществ, кроме демонтрации умственных отклонений автора подобного кода.
3 задача решена неверно)
Для меня сложно было второе. В третьем сразу понял что нужно параллельно сортированный список создавать при инициализации и добавлять в нужное место новый при пуше
Никто не написал про ваш сайт - отличный инструмент для подготовки к собеседованию! Подольше бы он оставался бесплатным!
Вы реально не знали ответ на эти задачи будучи синьором? Или спецом тупили чтобы не спалил интервьюер? Если первое, то получается такие сложные вопросы или вы не такой хороший синьор?! И как проходить такие собесы челам без опыта?!
В маленькой компании синьором можно стать имея год опыта.
По поводу "И как проходить такие собесы челам без опыта?!" - А как проходят собеседования для FANGа ? Есть разные видоскики на Ютубе, где люди рассказывают как они по много месяцев прорешивали задачи на LeetCode + там же можно изучать чужие решения. Через год такой практики вы тоже сможете быстро находить решения под такие задачки на собесах - в подсознании уже накопятся типовые алгоритмические решения.
@@PeterSidoroff, целый год тратить на алгосы) звучит жестко
@@vor6758 в гугл по алгосам чтоб попасть надо их лет пять на олимпиадах применять, в среднем :-)
get_first_matching_object=lambda pred,obj=[]:next((v for v in obj if pred(v)),None)
Пару комментов:
задача 2.
1. Полагаю не стоит использовать isinstance, т.к. есть риск получить проблемы с наследованием при расширении списка передаваемых эксепшенов (например, передали еще LookupError, lambda: print(3)) и получили не ожидаемое поведение). type проверит на точное совпадение.
2. Вызов ex[1]() производится без параметров, что в случае IndexError("bar") выбросит missing required positional argument. Полагаю, это проблема постановки задачи и некоторой не внимательности при выполнении.
3. raise e стоит вынести из условия, иначе ломается логика, если выбрасывается эксепшн не переданный в списке.
задача 3.
1. Использование list говорит, что у нас О(1) будет не совсем честная. Если докапываться, то какой-нибудь связный список - самое то.
2. Для второго списка за счет чуть большего количества памяти можно поддерживать более простую логику (храним список минимумов).
def push(self, num: int) -> None:
self.stack.append(num)
self.min_nums.append(min(lst[-1] if lst else num, num))
def pop() -> int:
self.min_nums.pop()
return self.stack.pop()
2 месяца лета не зря... 1 задачу я решил, на второй запутался, но по ходу событий понял, что надо было сделать, а в 3 я сразу понял, что надо было сделать, да и сделал
С нуля за два месяца?
Где учился????
@@dllb сам по книгам, примерами алгоритмов, литкоду. Мне на курсах только базу синтаксиса дали
@@funtickgd9502 а какие курсы и книги использовал?
@@funtickgd9502 Помоги, пожалуйста. Вот тоже из скачанных курсов получил базу, но а щас я хз, че мне делать.. Хочу на веб-разраба пойти и по идее до изучения самого django нужно просто решать задачи и так далее, но я вообще не понимаю, где можно было бы подчеркнуть действительно важные и полезные знания ,а где практикой их закрепить.
Почему 3 задача проще 2?
Знания АСД помогли решить третью задачу в первые 4 секунды после ее прочтения
что это?
@@knowledgedose1956 алгоритмы и структуры данных
@@knowledgedose1956 Абстрактно синтаксическое дерево, полагаю
Push все равно кривой получился. Если до конца списка делать pop, то с какого-то момента не будет значений из упорядоченного списка. Всё из за условия добавления
Для этого есть условие в pop:
if res == self.min_nums[-1]
Нет, там правильно. В push-е стоит условие на пустой массив мин.чисел и на возможное совпадение с текущим мин.числом (
@@PeterSidoroff там фича в том, что добавление в упорядоченный массив у тебя происходит только при пуше меньшего элемента, т.е. push(1), push(2), push(3), pop() -> 1, pop() -> None т.к. 2 и 3 тупо не добавлялись, оба гения сидят(как сделать пуш за О(1) если там придется по нормальному по всему массиву проходиться чтобы его в нужное место воткнуть не представляю)
@@QKekos в вашем случае при вызове pop() удалится 3, потом 2. А 1 так и будет минимальным числом в стеке.
в первой задаче не нужно разделять худший/лучший случай, строго говоря - твой ответ некорректный, правильный - просто О(N), но для джуна норм
почемуто 3 задача показалась самой прстой)
20:55
def get_min(self):
return min(self.stack) if self.stack else None, надеюсь так будет,ибо я тупой совсем
А так разве нельзя было сделать? или я чего то не понимаю?
по времени это занимает O(n), т.к. нужно пройтись по всему массиву и найти минимальное. Спрашивалось более оптимальное решение
33 минуты боли, но увы без этого никуда, сразу вспомнил все свои тупняки))
Плохо ты претворялся друг ), джун тупит страшнее
каждый раз искать минимум массива?
Блин даже первая задача вызвала звон в голове...
Прорвемся, готовимся дальше)))
в защиту автора видео хочу сказать, что на собеседовании очень сильный стресс и даже такие легкие задачи как первая могут вогнать в ступор, так как очень много нервов мешает думать. Это надо прокачивать скилл прохождения собеседований, чтобы на них не переживать
хех, одно дело вещать по подготовленному сценарию, а другое дело в realtime. Хорошо порешал
Первые две задачи без комментариев - там ничего сложного. 3-я задача встречалась в нескольких курсах по алгоритмам и структурам данных, поэтому если знаешь, то реализовать ее тоже не составляет большого труда.
Кому интересно, вот такой код у меня получился на последний вопрос.
class Stack:
def __init__(self):
self.stack = []
self.pref_min = []
self.current_min = None
def pop(self):
self.stack.pop()
self.pref_min.pop()
self.current_min = self.pref_min[-1]
def push(self, num):
self.stack.append(num)
self.current_min = min(
self.pref_min[-1], num) if self.pref_min else num
self.pref_min.append(self.current_min)
def top(self):
return self.stack[-1]
def get_min(self):
return self.current_min
a = Stack()
for i in [10, 2, 5, 4, 6, -1]:
a.push(i)
a.pop()
print(a.top())
эээ а не проще ли через словарь созданный из типов исключений и обработчиков - хватем исключение e и проверяем функцией из первого задания
if match:=get_first_matching_object(pred=lambda x:x in ourdict,[type(e)]+list(type(e).__bases__)):match()
raise e?
Читаемость огонь.
Бл как надоели люди которые пишут что это просто нереально легко было все. Вы сидите смотрите видео, говорят ответ, вы в голове прокрутили и ответили про себя лучше и это изи. А вы отвечайте сами сперва, а потом слушайте ответ. 90 процентов кто писал «изи на все ответил» сразу откиснут
Веселее всего, когда понимаешь что третья задача в видео решена неверно или точнее не для всех случаев, а те кому просто этого и не поняли)
Я почему то думал что Джунам сложнее вопросы задают, я знаю почти всё что было на собесе из видео, но я до сих пор не нашел работу, может я что-то делаю не так. Хотя у меня и собеса никогда не было :). Видео придало мне уверенности в своих знаниях, надеюсь скоро найду работу
Сколько учишься уже?
А на какое количество вакансий ты отправлял резюме? Сейчас на джунов высокая конкуренция, поэтому надо просто часами сидеть на сервисах поиска работы и закидывать своё резюме везде где можешь
так это база, тут ничего трудного нет
@@gggppp228какие шансы джуну устроится на удаленку ?
Да... с каждым годом требы к Джунам увеличиваются в геометрической прогрессии😅😅 .... Страшно представить чем занимаются Мидлы и Сеньоры😅😅... Прямо в офисе чилят и эксплуатируют бедных Джунов😭😭😭
Посмотри документацию pydantic, раздел "Handling custom generic classes", где рядом есть плашка warning с текстом "This is an advanced technique that you might not need in the beginning". Мидлы это те, кто такие штуки применяет, а сеньоры - кто придумывает.
Согласен
Посоны, я senior/architect, на всё бОльшее количество проектов джунов даже страшно брать потому что некогда исправлять ошибки, учить или ждать пока сам научится. Требы к знаниям не растут потому что senior всегда должен был знать _всё_, а вот требы к срокам да (чем дальше, тем быстрее надо работать).
выходит у меня в 16 лет уровень джуниор? и зачем мне в универ поступать тогда...
это явно не уровень джуна и не 100 тысяч зп, первая задача только, остальные уровня мидл
нет) порог входа с каждым разом всё выше, мб раньше джунам нужно было ложкой с первого раз в рот попадать, и их уже брали доучиваться, но сейчас ищут самостоятельных спецов, 2 и 3 задачи вполне адекватные, проверяют твои знания в ООП (не совсем), алгоритмах и структурах данных и основах языка, декораторы используются везде, с ними тоже нужно уметь работать уже на начальных стадиях
Что задачи, что вопросы это уровень стажера
@@myacc2517 может сразу уровень школьника начальных классов?
@@ChrisColeDC Первая задача сравнима с заданием на егэ, вторая и третья это основа основ
Если для вас эти задачи на мидлов, то у меня плохие новости
@@myacc2517 чел ты сейчас автора видео дураком выставил)))
полтора гола ежедневной учебы и 100к ваши. На самом деле пох сколько предлагают 50, 70, 100. Если компания норм, то сам факт влиться в структуру и уже расти по грейду это и есть основная цель.
Прикол конечно. Такие задачи могут на мидла и синьера дать, с зп в 2-4 раза больше
Угораешь? Я даже не джун это решаю
@@irwynptytzelow молодец, что сказать то тут) но я тут оффер на 300к получил без решения подобных задач, так что точно знаю о чем говорю)
Мне кажется, что это совсем не для джуна, а на стажёра какого - нибудь. Уж слишком просто
Это рофел?
@@goldgold594, нет
Один из вариантов решения первой задачи:
def get_first_matching_object(predicate, objects):
return next((x for x in objects if predicate(x)), None)
Да проще filter использовать
@@SabFo_ лист компрехеншен выполняется быстрее
@@maximkoltsov9833 Лист компрехеншен создаст список, пройдясь по всем объектам. Это избыточно, как по памяти, так и по времени.
@@saitaro ладно, согласен, ошибся
@@saitaro круглые скобки это не лист компрехеншен а генератор эскпрешн, ленивые вычисления, некст один раз выполнится да и все, дальше эвальюейтится ничего не будет(но понятное дело, что само условие будет проверяться для каждого элемента до первого трушного)
ну так декораторы с параметрами писали во втором пайтоне, изращение, уже как 10 лет можно проще
Не знаю ответ ни на одну задачу. Учусь питону уже второй день.
Я тупой, надо бросать?
Ахах, за 22 дня ты не сможешь этот собес пройти. Это серьзная работа, нужно много времени потратить, чтобы научиться.
Бросай
@@digitaIdevil хорошо, пошёл бросать
@@SaintVes 🤣🤣
@@SaintVesскажи, куда бросил? Просто так спрашиваю
Очень хорошее видео, прям как гора с плеч.
🐯
Привет, мне очень нравятся твои видео, можешь ли ты пожалуйста в одном из следующих видео рассказать как сделать онлайн оплату чего либо
вообще не понял третью задачу. Первое что мне пришло в голову - создать связный список. Добавление - переназначение указателя на вершину на новый, удаление - переназначение указателя на следующий, топ - указатель уже указывает на нужное, get_min можно искать при каждом добавлении элемента в стек или при его удалении(если уадлили минимальный, то нужно найти следующий минимальный), либо если по памяти нам все равно, то создать multi_set и там уже изи все хранить. первое что пришло в голову
Третье задание примерно на уровне ЕГЭ по информатике. Весьма доступно. Если учащийся сам смог найти решение егэшных задач, а не тупо зубрил шаблонные готовые решения, то третья задача ему вполне должна быть по силам.
А дядя смог вам объяснить как это пригодится при написании реальных задач с REST и бизнес логикой?
Очевидно, что никак
Молодец, ты конечно достоин
🎯 Key points for quick navigation:
[00:52] 🛠️ Нехватка типизации и неясность роли предиката, который выглядит как функция из-за своего вызова позднее.
[01:19] ⚠️ Некорректное использование изменяемого объекта в качестве значения по умолчанию для аргумента функции.
[01:45] 💡 Удаление избыточных строк и оптимизация конструкции для создания объектов.
[02:31] 🤔 Функция фильтрует массив объектов, возвращая первый подходящий элемент.
[04:04] ⚡️ Оптимизация функции для завершения работы при нахождении первого подходящего элемента.
[05:03] 💡 При вызове функции со списком объектов, функция будет возвращать объект, соответствующий первому элементу списка, или None, если подходящего элемента нет.
[06:35] 📝 Худшая временная сложность функции O(N), где N - количество элементов в массиве, а лучшая - O(1), если подходящий элемент находится в начале массива.
[07:02] 🤖 Длина выполнения алгоритма равна длине N списка.
[07:17] 🌟 Задача на собеседовании была легкой, но потребовались подсказки интервьюера.
[07:31] 🎁 Получите шпаргалку по алгоритмической сложности в Telegram-канале.
[08:11] 🌐 Платформа Solvit поможет вам подготовиться к техническим собеседованиям.
[08:55] 🚀 Обязательно пройдите по ссылке в описании и воспользуйтесь платформой Solvit.
[09:08] 👨💻 Задача на собеседовании: написать декоратор с параметрами.
[10:38] 📝 Функция, принимающая аргументы функции, может использовать ключевое слово args.
[12:58] 🤔 Если вы не знаете, как ответить на вопрос, попробуйте начать писать код и решение придет к вам по ходу дела.
[13:43] 🤖 Exception в Python может быть от базового класса Object
[14:17] 💡 Чтобы обработать исключения, можно использовать конструкцию try...except
[14:48] 👀 Для отладки удобно использовать декоратор из функции logging.debug()
[16:05] 📝 Сложная задача на проектирование класса, требующего оптимизации алгоритмов
[16:45] 📘 Написание класса с методами push, pop, top и getMin за O(1)
[17:20] 🤔 Для поиска минимального элемента нужно хранить отдельную переменную и обновлять ее при каждом push
[18:18] 💡 Для поиска минимального элемента можно использовать дополнительную переменную, хранящую второе минимальное значение
[19:56] 💡 При удалении элемента нужно пересчитать минимальное значение
[22:15] 🤔 Для хранения минимального значения одной переменной недостаточно
[22:45] 📝 Для обновления минимального значения нужно найти максимальное из двух значений
[25:10] 🗣️ Не бойтесь делиться своими мыслями, даже если они ошибочные. Открытость и готовность работать в команде очень важны.
[26:01] ⚡️ Стек может быть использован для реализации работы с неограниченным количеством переменных.
[27:43] 📈 Возрастающая последовательность чисел может быть использована для создания структуры данных, где новое число добавляется только если оно меньше предыдущего.
[28:36] 💪 При удалении элемента из возрастающей последовательности можно не учитывать элементы, которые больше или равны удаляемому.
[29:12] 🔄 Элементы в последовательности могут повторяться, что следует учитывать при реализации структуры данных.
[30:08] 📝 Для реализации стека можно использовать массив с последним элементом, который будет соответствовать минимальному значению.
[32:10] 🗣️ Задавать грамотные вопросы интервьюеру также важно, как и решать задачи. Это показывает вашу заинтересованность и адекватность.
Made with HARPA AI
это троллинг? слишком сложно для JUNIOR
Когда-то это было так, сейчас некоторые пишут, что это даже не уровень стажера, ибо конкуренция растёт
@@TheWorld-hs1hf да не, бред же, сейчас очень сильно не хватает спецов в РФ
@@helish_88 да, но это не мешает им так делать. Сам глянь другие свежие собеседования
На питоне не пишу, знаю только школьную программу, поехали.
1. Получить первый объект, соответствующий условию предиката. Она создает список, прогоняя объекты через предикат, и возращает первый элемент, если список не пустой
2. Без понятия :D
3. честно говоря, мне такая задача попадалась в одном курсе. Я просто использовал словарь(ключ: число, значение: количество чисел) и стек одновременно: ко всем новым в стеке числам в словаре прибавляется единица. И когда нужно получить минимальный элемент, просто выбираем первый элемент словаря
Получается, 1 - правильно, 2 - неправильно, 3 - правильно.
знаю только школьную программу... мне такая задача попадалась в одном курсе.
@@Forarit Я знаю только школьную программу питона, курс был про другое
Тут третья задача не про подсчет элементов, да и нет такого понятия как «первый элемент словаря»
@@shehamane3518 В словаре элементы отсортированы, я подразумеваю первым элементом минимальный. Про подсчёт, не про подсчёт, но задача решена
не понял, почему нельзя просто
def get_min(self):
return min(self.stack)
все остальные методы изменяют данные self.stack и метод всегда будет возвращать данные согласно актуальному стеку.
Либо я не понял задачу
Требуется решить за постоянное время, а у Вас O(n)
Потому что эта функция занимает O(n) времени, а нужно O(1)
Возможно это старая запись вашего интерьерью? Вопросы не тянут даже на стажёра
Что же тогда должны были спросить? Как написать свой фейсбук или нетфликс?
@@Артем-п6ф9эчувствую, в 2025 от джунов (по крайней мере в вебе) будут требовать написать полноценное приложение-чат (при этом не просто чат, а асинхронный real-time чат), который полностью заменит чат в каком-нибудь вк, так еще и с разделением на личные сообщения и беседу, и это в качестве тестового задания, но платит таким спецам будут те же 50-80к; а уже в 2027 такое задание на джуна тянуть не будет. Люди всё больше идут в программирование, python один самых популярных языков (если не самый), конкуренция на позицию джуниор огромная, так как все торопятся выйти на работу. Зарплаты растут медленно, уровень понимания и количество знаний должны быть всё глубже и больше, ну и помимо этого увеличивается требуемое количество сайд скиллов (по типу git, но конкретно к нему нет претензий, просто для ясности пример)
@@Артем-п6ф9эзачем "как"? Просто написать. Причем чтобы к концу лайв кодинга количество пользователей было больше, чем в ТГ. Это на Джуна. На стажёра - больше, чем в Фейсбук
Последняя задача не до конца решена.
1. Есть бы сделаем push(3), push(6), push(7), pop(3) и запросим get_min, нам отдаст IndexError, хотябы по идеи должен отдать 6.
Мы никак не сможем добиться O(1) в get_min, за исключением, если будем постоянно держать в get_min отсортированную коллекцию, но тогда у других операций увеличится Time Complexity.
сможем, например, вот так:
class Stack:
def __init__(self):
self.stack = []
self.mins = []
def push(self, n: int):
self.stack.append(n)
self.mins.append(min(self.get_min(), n) if self.mins else n)
def pop(self) -> int:
self.mins.pop()
return self.stack.pop()
def top(self) -> int:
return self.stack[-1]
def get_min(self) -> int:
return self.mins[-1]
и да, решение на видео с ошибкой, в некоторых случаях неправильно сработает.
@@pavelosipov5951 def pop() у тебя неверно работает
так это же стэк, мы можем удалить из него тока последнее число
"One Stack (stack of pair value,minvalue):"
def pop(O):return O.s.pop()[0] $$$ def top(O):return O.s[-1][0] $$$ def get_min(O):return O.s[-1][1] $$$ def __init__(O): O.s=[(float('inf'),float('inf'))] $$$ def push(O,v): O.s.append(v,min(v,O.get_min())
# храним в стеке сами значения и его текущий минимум
@@pavelosipov5951 И правда, что-то я ошибся. Спасибо за разъяснение.
"One Stack (stack of pair value,minvalue):"
def pop(O):return O.s.pop()[0] $$$ def top(O):return O.s[-1][0] $$$ def get_min(O):return O.s[-1][1] $$$ def __init__(O): O.s=[(float('inf'),float('inf'))] $$$ def push(O,v): O.s.append(v,min(v,O.get_min())
# храним в стеке сами значения и его текущий минимум
По-моему некорректно говорить, что в худшем случае О(n), а в лучшем O(1), O вроде описывает имеено поведение в среднем (но надо посмотреть, сходу что-то не находится)
O-нотация характеризует верхнюю границу. Например алгоритм быстрой сортировки в худшем случае (при неудачном выборе опорных элементов) может выполниться за O(n*n), но верхняя граница в среднем находится на O(nlogn).
@@EgorKissa а что в лучшем случае она ограничена константой всё же корректно говорить или нет?
@@sergem6860 нет
Многовато 100 рублей за такие задачи имхо, как SDET Ruby говорю. А кому кажется это сложным, идите в мак на кассу, it это не ваше.
а как вы проводите собеседования? какие задачи даете?
@@artemshumeiko У меня не веб разработка (хоть я и знаю RoR), но если тезисно, то интервью состоит из двух частей. 1) Теория: rest, soap, sql, ci/cd, git и тд. Практика: лайвкодинг по задачам. Задачи от элементарных, типа "найти ошибку в простейшем методе" или "что вернет этот метод", до сложных на ООП с подковырками, где в классе используются миксины и модификаторы доступа. Крутого кандидата могу и по метапрограммированию спросить, и попросить поднять простейший кастомный фреймворк для АТ, но джунов я не собесил, не было нужды, всегда мидлы и выше.
З.ы. НИКОГДА не спрашиваю теорию тестирования типа "чем смок отличается от санити", "артефакты тестирования" и прочую чепуху. Это вопросы для ручников-стажеров, а для AQA и SDET такие вопросы == по глупости, как и "кем себя видишь..." )))
@@artemshumeiko У меня не веб разработка (хоть я и знаю RoR), но если тезисно, то интервью состоит из двух частей. 1) Теория: rest, soap, sql, ci/cd, git и тд. Практика: лайвкодинг по задачам. Задачи от элементарных, типа "найти ошибку в простейшем методе" или "что вернет этот метод", до сложных на ООП с подковырками, где в классе используются миксины и модификаторы доступа. Крутого кандидата могу и по метапрограммированию спросить, и попросить поднять простейший кастомный фреймворк для АТ, но джунов я не собесил, не было нужды, всегда мидлы и выше.
@@alexander_gkс каких пор миксины, модификаторы доступа и вопросы по метапрограммированию это уровень выше слабого стажера (Что-то типа стажер- -)? Если добавить туда хорошее (± глубокое) понимание асинхронного программирования и отличия асинхронности от многопоточности, многопроцессорности, а для практики добавить задание с написанием функции с использованием asyncio, то, базару ноль, кандидат тянет на стажера, можно даже деньги ему платить, 25-30к
@@TheWorld-hs1hf с каких пор описанное тобой - это стажёр? Стажёр - это когда ты пишешь в сознании сразу двоичный код и передаешь его из нейронов в процессор.
def push(self,v): self.t+=1; self.s.append(q:=(v,self.t)); heapq.heappush(self.pq,q)
def pop(self): v,t=self.s.pop(); set(heapq.heappop(pq) for _ in itertools.takewhile(lambda v:v[1]>=t,pq)); return v
def top(self):return self.s[-1][0] $$$$это разрыв строки$$$ def get_min(self):return self.pq[0][0]
def __init__(self): self.s,self.pq,self.t=[],[(float('inf'),0)],0
def push(self,v): self.s.append(v); v
Где таким задачам обучиться?
leetcode
Кажется последняя задача решается линкедлистом с указателем на последнюю ноду, а в ноде с указателями на предыдущую и минимальную.
И не надо создавать второй лист
Тогда вам нужен кастомный ЛЛ с двумя указателями. Можно упростить и держать минимальное значение в каждой ноде вместо указателя. Но это будет занимать больше места.
@@anoshin45 написать класс с 3 полями сложно?
@@VaeV1ct1s Упростить в плане не заморачиватся с указателями на минимальное значение.
@@anoshin45 зачем забивать память? Оно у тебя хранится в ноде, на которую ты указываешь. В чем простота?
@@VaeV1ct1s а если у тебя два дупликэйта. Ты сам на себя будешь ссылаться ?