Решаем тестовое задание на позицию junior python backend разработчик

แชร์
ฝัง
  • เผยแพร่เมื่อ 30 ต.ค. 2024

ความคิดเห็น • 37

  • @qq-wg3ng
    @qq-wg3ng 7 หลายเดือนก่อน +8

    1. Забудь про insert в лист) Если тебе нужно сделать инсерт, ты что-то делаешь не так, асимптотика вставки O(длина листа). Либо передалай алгоритм, чтобы инсерт тебе был не нужен, либо использую хештаблицы/линкед листы/деревья поиска, в общем то, что подходит для быстрой вставки в рандомный индекс.
    2. Возможно, в задачке подразумевалось, что интервалы могут пересекаться, иначе задачка слишком простая выходит.
    3. Можешь такие задачки засовывать в какой-нибудь класс, конструктор на входе берет лист, по методу free_intervals возвращает свободные интервалы. Мб кто-то оценит)
    Я бы посортил вход по левой границе, прошел указателем по массиву и на лету сконструировал свободные интервалы. Крайние случаи: пересечение интервалом точки 00:00 и вложенность одного интервала в другой (если допускаются пересечения), их не сложно обработать.
    Успехов!

    • @pslups9086
      @pslups9086 6 หลายเดือนก่อน

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

    • @guiterenzog2723
      @guiterenzog2723 5 หลายเดือนก่อน

      ​@@pslups9086, да, нужно скопировать в новый массив то, что было до этого элемента, потом добавить элемент, скопировать то, что после элемента, итого получается используется О(n) по времени для обхода списка и O(1) для операции вставки нового

    • @RANETKA234
      @RANETKA234 5 หลายเดือนก่อน

      2-3 недели обучаюсь программированию. Чето пересечения и вложенности не могу придумать как обработать. Создал функцию на проверку пересечения для 2х списков - на выходе True/False. Понятно, что и при пересечении, и при вложенности надо возвращать одно и тоже (минимальный из первых элементов двух списков и максимальных из вторых элементов). Но как это сделать? Допустим, я начал проверять каждый с каждым (кроме себя и предыдущих). Первый список ни с кем не пересекся - я его добавляю в новый список. Второй пересекся с 3им - добавляю их объединение, а если 3ий потом пересечется с 4ым??? На выходе опять будут пересекающиеся интервалы... Ну, можно ещё раз функцией прогнать - а сколько раз? Рекурсию чтоль жахнуть с остановкой, когда итоговый список вернет сам себя? Вот пока писал комментарий придумал чето)) Сча попробую.
      UPD. Еле-еле получилось, но работает правильно, только если сквозь 00-00 изначально проходит не больше одного промежутка.

    • @qq-wg3ng
      @qq-wg3ng 5 หลายเดือนก่อน

      @@RANETKA234 Уберем отрезки, пересекающие точку 00-00, потом обработаем их отдельно. Создадим массив пар (время события, тип события), где события бывают 2-ух типов: кто-то занял кабинет и кто-то перестал занимать кабинет. Отсортируем этот массив по возрастанию и пройдем по нему циклом: заведем переменную counter = 0, если встречаем событие кабинет занят, то counter++, если событие кабинет перестал быть занят, то counter--. В итоге кабинет занят только тогда, когда counter > 0. Если counter становится равным 0, то промежуток от текущей точки до предыдущей, когда counter был равен нулю - промежуток, где кабинет занят. Остается сохранить такие промежутки, можно прямо в этом же цикле. Из них уже можно просто получить промежутки, когда кабинет свободен. Отрезки, пересекающие 00-00 можно обработать все разом, пройдя по ним циклом и найдя минимальный левый и максимальный правый концы, тогда отрезки от максимального левого до 0 и от 0 до макисмального правого заняты. Асимптотика O(n logn), где n длина списка с промежутками.
      Вообще решения такого типа называются "сканирующая прямая", можешь погуглить.

    • @RANETKA234
      @RANETKA234 5 หลายเดือนก่อน

      @@qq-wg3ng Получилось. Прогнал тест на время, вышло почти в 3 раза быстрее, чем то, что до этого написал).

  • @ce2434
    @ce2434 3 หลายเดือนก่อน +1

    Видео хорошее в целом, но код пованивает. Никто на проекте не будет использовать такое, чтобы рассчитать интервалы, я уверен там и баги найдутся. Легче использовать модуль time/datetime, НО, для разогрева головы - хорошая идея делать без модулей, много вариантов решения задачи и можно увидеть как джун думает. Лайк

    • @nerdizay
      @nerdizay  2 หลายเดือนก่อน

      Привет! Насчёт багов уже не подскажу, но тогда был уверен, что их нет:) Я подумываю о том, чтобы переснять уже с тем вариантом как сейчас бы решил) Не знаю, почему, но пока это самый популярный ролик на канале хах

  • @milssky
    @milssky 3 หลายเดือนก่อน +1

    А почему не использовали модуль time со всеми его плюшками?

    • @ce2434
      @ce2434 3 หลายเดือนก่อน +1

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

    • @nerdizay
      @nerdizay  2 หลายเดือนก่อน +1

      Я не помню!) Может быть правда задача была такая.. думаю, потом пересниму это видео) Вообще интересно спустя время обращаться к тем же задачам но уже с другими знаниями и опытом

    • @nerdizay
      @nerdizay  2 หลายเดือนก่อน

      Вполне возможно что я просто не знал о таких функциях в datetime или time хаха) Но может быть и задание было такое)

    • @ce2434
      @ce2434 2 หลายเดือนก่อน

      @@nerdizay согласен с вами, смотрю через время на свой код и удивляюсь (в основном проблема с неймингом переменных)
      В целом скажу что решать задачу без модулей более интересно и даёт больше понимания работодателю как ты решаешь ту или иную задачу. Так что в теории даже немного полезно иногда так практиковать, но модули, тем более базовые, знать надо.

  • @danielfessow
    @danielfessow 8 หลายเดือนก่อน

    Интересное задание. Почему нет прсомотров и комментариев :(

  • @soyounoob
    @soyounoob 8 หลายเดือนก่อน +1

    А не лучше , чем в цикл в цикле интервалов перебирать, просто на основе листа [[a,b],..,[y,z]] создать лист [[0,a],[b,c],..,[x,y],[z,1440] в одном цикле путем последовательного присвоения, или это дольше работать будет?

    • @nerdizay
      @nerdizay  8 หลายเดือนก่อน

      Не знаю, может и лучше, пока не увидел код, не могу сказать:) Вообще, нет ничего страшного во вложенных for, потому что если мы знаем, что у нас маленький список, например, 5 элементов, и мы пройдемся по нему 2 раза - for for, то будет 25 итераций, а если список будет из 30-ти элементов и мы пройдёмся по нему 1 раз - один for, то итерацией все равно будет больше. На видео внутренний цикл проходит по 2 элементам)

  • @UchihaItachi-yh5ul
    @UchihaItachi-yh5ul 7 หลายเดือนก่อน

    А что за синтаксис такой? В def стрелка ->

    • @nerdizay
      @nerdizay  7 หลายเดือนก่อน

      Тайп хинты)
      -> говорит о том, какого типа данные функция вернёт, в python это что-то вроде фейка, пока что, разве что расширение какое-нибудь для IDE будет подсвечивать некорректное использование типов. Также знаю, что есть mypy, который не позволит запустить программу в случае ошибки, то есть грубо говоря ошибки будут на этапе компиляции а не в runtime

    • @ce2434
      @ce2434 3 หลายเดือนก่อน

      Кароч это некая документация для функций, какого типа должны быть принимаемые объекты и какой тип функция должна вернуть

  • @user-xz5oz
    @user-xz5oz 4 หลายเดือนก่อน

    А datetime нельзя пользовать?

    • @nerdizay
      @nerdizay  4 หลายเดือนก่อน

      Запрета не было, насколько помню

  • @buhenvaldflava1910
    @buhenvaldflava1910 7 หลายเดือนก่อน

    Как будто бы халява, но интерсная)

    • @nerdizay
      @nerdizay  7 หลายเดือนก่อน +2

      Для меня это загадка, почему людям это задание кажется интересным, а там где второе такое видео за вакансию 150к, где тоже халява, не интересным, тут 3к просмотров, там 50, тут нет превьюхи привлекательной, а там хоть какая-то яркая:)

    • @RoniMstoian
      @RoniMstoian 4 หลายเดือนก่อน +1

      А можно получить код. Я просто хочу покататься в нем. Я только обучаюсь. И я вообще не понял решение(

    • @nerdizay
      @nerdizay  3 หลายเดือนก่อน +1

      @@RoniMstoian Да, конечно, держи: gitlab.com/nerdizay/free_busy_shedule_test_task

  • @VVVanalog
    @VVVanalog 4 หลายเดือนก่อน

    Как установить на pycharm русский язык? :)

    • @nerdizay
      @nerdizay  4 หลายเดือนก่อน

      Я использую vs code) в vs code достаточно в разделе расширения вбить в поиск russian, затем установить, и после установки подтвердить смену языка в открывшемся модальном окне. Возможно в pycharm примерно также.

    • @black_grizzly
      @black_grizzly 3 หลายเดือนก่อน

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

    • @io-2483
      @io-2483 3 หลายเดือนก่อน

      @@black_grizzly есть

    • @cherimolah9493
      @cherimolah9493 3 หลายเดือนก่อน +2

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

  • @СергейКоваль-ь1в
    @СергейКоваль-ь1в 3 หลายเดือนก่อน

    Материал нормальный, а вот подача плохая!

    • @nerdizay
      @nerdizay  2 หลายเดือนก่อน

      Да и материал так себе)))