Собеседование Middle C++

Поделиться
HTML-код
  • Опубликовано: 15 ноя 2024

Комментарии • 105

  • @aleksanderaksenov1363
    @aleksanderaksenov1363 Год назад +39

    Ну и на каких реальных проектах решаются такие типовые задачи?)Решаются задачи вроде разбор архитектуры,нахождение эффективного решения,написание опредленных подсистем,тут намного больше нужно аналитическое мышление чем знание синтакиса С++.Если возникают проблемы с синтксисом то это гуглиться за пару минут.Весь этот литкодный подход это на поиск кодера,человека который бездумного просто будет выполнять задачи.В настоящее время переизбычтка игфрмации запоминание типовых алгоритмов-вздор😁Намного больше смысла для позиции от Middle давать задачи на построение архитектуры и эффективного решения,даже на псевдокоде

    • @olexayko
      @olexayko 11 месяцев назад +6

      Кинь пожалуйста тогда ссылку на какой-то собес, который тебе понравился, по С++

    • @orhanaliyev9774
      @orhanaliyev9774 2 месяца назад

      А что сложного найти в списке максимальное число ? )) По сути самое длинное это максимальное число ,та даже не надо считать цифры и прочие извращения ,а чувак все усложнил.. Тупой линейный поиск ,даже хеш таблиц пилить ненадо и прочие выкрутасы

    • @unlimited-007
      @unlimited-007 Месяц назад

      Полностью согласен, и еще у автора явная зацикленность на stl, может конечно только в этом видео, не знаю, но все же, может быть я конечно старомоден, я просто по работе и с микроконтроллерами сталкиваюсь, но все же на чистый си, тоже иногда хочется взглянуть, да работу с функциями ОС, тоже можно по спрашивать

  • @CatcherStat
    @CatcherStat Год назад +10

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

    • @allex-all
      @allex-all 11 месяцев назад

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

  • @lyaskamutchaev6569
    @lyaskamutchaev6569 Год назад +47

    не знал что оксимирон проводит собесы

    • @wsxpocxeafx
      @wsxpocxeafx 3 месяца назад

      🤣

    • @1FireKnight1
      @1FireKnight1 19 часов назад

      Массив вектор стринг
      Итератор мап бегин
      Маин воид инт
      Бул чар лонг флот раунд!

  • @user-kc4nd
    @user-kc4nd Год назад +2

    Спасибо, как всегда, круто 👍🏻

  • @Sergey_Kyl
    @Sergey_Kyl Год назад +3

    Смотрю такие видео и думаю: а они вообще программировать умеют?😅😂😂😂😂

    • @wsxpocxeafx
      @wsxpocxeafx 3 месяца назад +2

      А что было не так?

    • @wsxpocxeafx
      @wsxpocxeafx 3 месяца назад +1

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

  • @yuriynevazhno2542
    @yuriynevazhno2542 Год назад +5

    Ну что то мало.
    Хотелось увидеть лямбды, особенности их работы, применение в стандартных алгоритмах. Ну и потихоньку подтягивать фичи из новых стандартов (ranges, views).

    • @valentynmudryk2869
      @valentynmudryk2869 Год назад +2

      Дык а что лямбды разбирать. Генерируется класс функтор с перегруженным оператором. Не вижу ничего сильно интересного в них

    • @mrbibis7229
      @mrbibis7229 6 месяцев назад

      @@valentynmudryk2869 а зря, в них много интересного, например как использовать лямбды внутри списковой инициализации структур, что из себя представляет лямбда с auto аргументом (в функции до недавних времен auto в аргументы было нельзя писать, а в лямбды можно), про friend'овость лямбд объявленных в методах структуры (есть ли вообще возможность обращаться к private), про проблемы с оптимизацией в лямбдах, что делает mutable по отношению к лямбде и тп. :)

  • @user60336
    @user60336 Год назад +6

    Разве решение первой задачи не является ошибочным? Оно не учитывает числа, большие чем number. Так для number = 3. оно проигнорирует 33, 333 и т. д.

    • @crazyboom8909
      @crazyboom8909 Год назад

      Я недавно начал изучать c++, попробовал решить эту задачу, у меня получилось так:
      int getMax(const int *arr, int size, int number)
      {
      int maxFirst = 0;
      int maxSecond = 0;
      for (int i = 0; i < size; ++i)
      {
      if (arr[i] == number)
      {
      ++maxFirst;
      if (maxSecond < maxFirst)
      {
      maxSecond = maxFirst;
      }
      continue;
      }
      maxFirst = 0;
      }
      return maxSecond;
      }

    • @user60336
      @user60336 Год назад +1

      Там условие задачи звучит как "найдите количество цифр в самой длинной последовательности, состоящей из числа number." Этот код явно делает не это) И я бы Вам порекомендовал использовать std контейнеры вместо встроенных массивов

    • @crazyboom8909
      @crazyboom8909 Год назад

      @@user60336 С тем, что лучше использовать встроенные контейнеры вместо массивов я с вами согласен, но с чего вы решили, что данный код не удовлетворяет условию задачи?

    • @user60336
      @user60336 Год назад

      @@crazyboom8909 Как минимум потому, что он для последовательности чисел, приведённых в видео, для которых он должен возвращать ответ 4, возвращает 1)

    • @user60336
      @user60336 Год назад

      @@crazyboom8909 Если я правильно понял условия задачи, как-то так должен выглядеть ответ.
      int find_range_n(const std::vector& vec, int number)
      {
      int max{};
      for (auto n : vec)
      {
      int temp_max{};
      while (n > 0)
      {
      if (n % 10 == number)
      {
      temp_max++;
      }
      n /= 10;
      }
      if (temp_max > max)
      {
      max = temp_max;
      }
      }
      return max;
      }

  • @alexplaytop
    @alexplaytop 7 месяцев назад +1

    Для Джуна здесь много незнакомого, и многое непонятно))

  • @vladimir7666
    @vladimir7666 Год назад +2

    Это такой тест на мидла? )))))))))

  • @Дмитрий-щ1ч3ч
    @Дмитрий-щ1ч3ч Год назад +1

    Наконец-то что-то новое по cpp

  • @RedBallOfLove
    @RedBallOfLove Год назад +2

    Какие навыки или опыт проверяет первая задача?

    • @arthurlouiskarl
      @arthurlouiskarl Год назад

      умение соображать

    • @RedBallOfLove
      @RedBallOfLove Год назад

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

    • @arthurlouiskarl
      @arthurlouiskarl Год назад

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

    • @RedBallOfLove
      @RedBallOfLove Год назад

      ​@@arthurlouiskarl Только в 0.01% случаев, а может быть и меньше, вам приходится сталкиваться с сортировками. Остальное же время приходится прикручивать разные фреймворки, настраивать, ловить сотни различных багов и обходить их, собирать всё это вместе, пытаясь заставить этого монстра работать. Практически любое узкое место можно выловить на этапе оптимизации, а вот написать код, который можно будет читать, поддерживать и расширять - реальная проблема.

    • @arthurlouiskarl
      @arthurlouiskarl Год назад

      ​@@RedBallOfLove я и не спорю с этим. На подробное обсуждение построения архитектуры нужно много времени и это делается на отдельном интервью (так и называется обычно, дизайн приложений), на алго-интервью важно понять, насколько человек умеет думать. Если вы никогда не сталкивались с кем-то, кто хорошо говорит, имеет много лет "опыта", но не может понять логику простой сортировки или бинарного поиска - то, поверьте, такие бывают и их много.

  • @Alexander_Gurov_RF
    @Alexander_Gurov_RF Год назад

    Ответ про специальные команды процессора для работы с исключениями убил. 😂 И чел явно путает try и __try.

  • @Pa36ouHuK
    @Pa36ouHuK Год назад +12

    По второй задаче: изначально можно было идти по аналогии с std::string::find. Вернуть аналог npos.
    Чувак удивил, что смог isSame реализовать, но не выдал базу про set :)

    • @allex-all
      @allex-all 11 месяцев назад +2

      Может isSame он и смог благодаря документации)

    • @mrbibis7229
      @mrbibis7229 6 месяцев назад

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

    • @test1123581321
      @test1123581321 6 месяцев назад

      @@allex-all Да, очень похоже, что он код из документации переписал

  • @vilture5706
    @vilture5706 Год назад +3

    Спасибо, понял, что стоит подучить stl, а то как то нервно стало на шаблонах.
    Да и winapi посмотреть.
    Ps но все таки есть мысль, что для миддла важнее паттерны проектирования, алгоритмы и все что более существенно влияет на жизнь и стоимость проекта.
    Все таки шаблоны , stl и низкий уровень нужен тем, кто пишет библиотеки, а не десктоп.
    Важнее быстро написать надежный код, а не написать быстрый код.

    • @bergest4348
      @bergest4348 Год назад +7

      Так можно вообще писать код на ноде или питоне. Зачем вам плюсы тогда?

    • @jnarical
      @jnarical Год назад

      Быстро написать надёжный и ПОНЯТНЫЙ код ))) но я ненастоящий сварщик, хотя и пытаюсь стать настоящим

    • @bergest4348
      @bergest4348 Год назад +1

      @@jnarical так быстро и понятно это не в плюсы . Тут ни того ни другого.

    • @whoknows4728
      @whoknows4728 Год назад

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

    • @bergest4348
      @bergest4348 Год назад

      @@whoknows4728 нагуглить и вкурить паттерны

  • @soulspirit8687
    @soulspirit8687 Год назад

    где таких лажовых мидлов брать?

  • @theministryofnonsense
    @theministryofnonsense Год назад +3

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

    • @ambushedraccoon6408
      @ambushedraccoon6408  Год назад +2

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

  • @billjohnes9380
    @billjohnes9380 Год назад +5

    27:34 - совсем не обязательно переходить к ssize_t, теряя половину возможных значений, хотя требуется всего одно.
    Тем более, что в стандартах C/C++ этот тип не определён, хотя можно найти решение даже в этом случае, например, std::make_signed_t.
    Вполне достаточно пожертвовать всего одним значением, а именно -- максимальным, и ограничений это не внесёт никаких в силу наличия NULL-указателя.
    Для этого можно использовать SIZE_MAX (требуются header'ы cstdint и climits) или std::numeric_limits::max() (требуется header limits).
    Есть небольшое ощущение, что у интервьюера за последние полгода-год уровень подрос.

    • @bergest4348
      @bergest4348 Год назад +2

      Создавать в коде спящие баги не очень хорошо =) Хоть я и не могу представить ситуацию когда потребуется полностью заполненный вектор...
      У меня был этап когда я писал максимально ужатый код. Пытаясь выиграть по максимум памяти и быстродействия, ни к чему хорошему это не приводит обычно. Сложность возрастает, расширяемость падает. Да и не ты один над кодом трудишься...
      А в данном случае я бы возвращал булевский результат. А значение отправлял по ссылку. Ну или дополнительно где-нибудь добавил флаг ошибки. Всё зависит от конечного использования.

    • @billjohnes9380
      @billjohnes9380 Год назад +1

      @@bergest4348 Возвращать не значение, а bool'вский результат, а само значение -- по ссылке, может быть неудобно.
      Это не похоже на "спящий bug", тем более, что SIZE_MAX практически наверняка недостижимо, ибо как минимум один адрес (NULL) исключается.
      Если вы посмотрите на cppreference описание strtoul в части возвращаемого значения, то увидите, что там подход -- аналогичный.
      В стандартной библиотеке C++ тоже создают спящие bug'и?

    • @bergest4348
      @bergest4348 Год назад

      @@billjohnes9380 В любом случае это особенность которую нужно помнить. По поводу логики - а смысл тогда возвращать ошибку если мы не делаем обработку этих ошибок. Единственная проблема - 2 доп переменных, которые в случае с ограниченной памятью нам не нужны. Ну моё мнение - реализация зависит от конкретной задачи.

    • @billjohnes9380
      @billjohnes9380 Год назад

      ​@@bergest4348 Эта "особенность" широко распространена, включая случаи возврата беззнаковых типов, и даже встречается в стандартной библиотеке.
      В программировании вообще много особенностей, про которые следует помнить, иначе -- чревато.
      Может быть так, что обработка ошибок отдаётся выше в вызывающие функции, и в случае возврата SIZE_MAX при ошибке нет необходимости в переменной.
      И даже если не отдавать ошибки на обработку выше, то в вашем случае невозможно завести const'антную переменную, которая примет значение.
      Однако, моё изначальное замечание касалось не разумности применения в данном случае техники возврата специального значения как индикатора ошибки, а всё-таки использования данной техники разумным способом, а не тем, который был озвучен во время собеседования.

    • @bergest4348
      @bergest4348 Год назад

      @@billjohnes9380 с этим я полностью согласен =)

  • @Lala-gu4qi
    @Lala-gu4qi Год назад +2

    Первая задача вроде как решена не правильно. find находит первый элемент в контейнере - получается эта функция для вектора vec = {5, 1, 1, 4, 1, 1, 1, 1, 1} и number = 1 вернет 3 (зацепив 5-ку), хотя правильный ответ 5. Я так понимаю он хотел написать что-то типа этого:
    size_t max = 0;
    auto first_match = std::find(vec.begin(), vec.end(), number);
    while(first_match != vec.end()) {
    auto last_match = std::find_if(first_match, vec.end(), [number](const int elem){return elem != number;});
    max = std::max(static_cast(std::distance(first_match, last_match)), max);
    first_match = std::find(last_match, vec.end(), number);
    }
    return max;
    Хотя он, вроде как, не эффективнее наивного решения (Оба за O(N)), просто выглядит компактнее и более читаемо

  • @DadundddaD
    @DadundddaD 6 месяцев назад

    int find_range_n(const std::vector& vec, int number)
    {
    char cnum = '0' + number;
    int maxn = 0;
    for (auto el : vec) {
    string strn = to_string(el);
    int len = ranges::count(strn, cnum);
    if (len == strn.size() && maxn < len) {
    maxn = len;
    }
    }
    return maxn;
    }
    Что в видео, что в комментах, реализация этой функции вообще не имеет отношения к поставленной задаче.
    Вот правильное решение, хотя и не оптимальное.

  • @HBercut
    @HBercut 5 месяцев назад

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

    • @ambushedraccoon6408
      @ambushedraccoon6408  4 месяца назад

      Было бы некорректно назвать как-то иначе, я бы вводил зрителей/кандидатов в заблуждение. Так она называется в стандартной библиотеке.
      en.cppreference.com/w/cpp/types/is_same

  • @l_y5398
    @l_y5398 Год назад

    можно ссылку на документацию?

  • @ArturPukhavoi
    @ArturPukhavoi Год назад

    👍

  • @wsxpocxeafx
    @wsxpocxeafx 3 месяца назад

    23:30 Зачем что-то рассказывать? Вы пишите код в IDE. Вам нужно было тут же написать тесты и проверить свой же код. Будь ты хоть с 15 летним опытом, не факт, что ты в голове правильно проверил, что код работает. Тесты люди не просто так пишут, хоть 40 лет опыта.

  • @wsxpocxeafx
    @wsxpocxeafx 3 месяца назад

    В начале каждой глобальной функции можно написать using namespace std; и не писать везде этот неймспейс, удлиняя код и тратя время на написание длинного кода.

    • @JohnDoe-pn7nj
      @JohnDoe-pn7nj 2 месяца назад

      считается плохой практикой так делать, у них привычка уже std:: писать

    • @wsxpocxeafx
      @wsxpocxeafx 2 месяца назад

      В чём это плохая практика? Писать в файле я ещё могу понять, что это может привести к некоторым конфликтам или ещё чему-то. В функции это выглядит не всегда красиво. Но писать нэймспейсы, как мне кажется, не лучшая идея. Слишком длинный код. Или это только к std относится?

  • @AgnosTeos
    @AgnosTeos Год назад

    Не понятно какой документацией он пользовался ? Очень удобная штука, напишите название пожалуйста.

  • @alexgorodecky1661
    @alexgorodecky1661 Год назад +3

    Что-то унылый какой-то мидл, я так пару недель в VisualStudio посижу и за синьора сойду 😀

  • @AndreySedov
    @AndreySedov Год назад +1

    КьюТЭ. Всё -уволен. Не прошел 😂😂😅
    Ваще нифига не понял чо за дичь в задачах была и почему типеид не катит

    • @RedJerick
      @RedJerick Год назад

      Потому что "типеид" не будет работать при выключенном RTTI. И вопрос был именно про шаблоны а не RTTI.

    • @Mapdyk
      @Mapdyk 9 месяцев назад +1

      У нас в конторе все говорят "кутИ", хоть кол на голове чеши)

  • @StasonST19
    @StasonST19 Год назад

    nice

  • @EnforaDebug
    @EnforaDebug 10 месяцев назад +1

    По первой задаче: Кто нибудь, объясните мне, дураку, почему этот код вообще должен работать?
    if (n = number) - оно же никогда не выполнится. N последовательно перебирается элементами массива, number = 3.
    Может, если надо найти самую длительную последовательность из 3, надо так:
    unsigned int max_arr = 0;
    for (auto n: arr) {
    if (n % number != 0) continue;
    if ((n / number) > max_arr) max_arr = n;
    }
    Тогда на выходе, да, получим самый длинный элемент, состоящий из последовательности number

  • @bergest4348
    @bergest4348 Год назад +2

    Как по мне инкрементить значения при переборе не имеет смысла(1я задача). Достаточно использовать разницу указателей. Поскольку вектор это тот же массив в юбке.

    • @isljack3117
      @isljack3117 Год назад

      Привет. Не мог ты показать пример? Опыт лишним не будет :)
      Я cделал так (по сути схоже с его реализацией):
      int find_range_n(const std::vector& vec, int number){
      int count{0}, maxCount{0};
      for (auto a:vec) {
      if (a == number) {
      count++;
      if (maxCount < count) {
      maxCount = count;
      }
      }
      else {
      count = 0;
      }
      }
      return maxCount;
      }
      Громоздко.

    • @bergest4348
      @bergest4348 Год назад

      @@isljack3117
      int find_range_n(const std::vector& vec, int number){
      const int* first = nullptr;
      long int res = 0;
      for(auto& i : vec) {
      if(number == i) {
      if(!first)
      first = &i;
      } else {
      if(first) {
      res = std::max(res, &i - first);
      first = nullptr;
      }
      }
      }
      if(first) {
      return std::max(res, (&vec.back() - first) + 1);
      }
      return res;
      }

    • @RedJerick
      @RedJerick Год назад +1

      @@bergest4348 Твое решение хуже читается и менее эффективно. У тебя на каждую итерацию делается больше условных проверок, которые сложнее чем просто инкрементировать значение. Так же твое решение хуже масштабируется, если нам в будущем понадобится реализовать такой же алгоритм для другого типа контейнера, например, для списка, твое решение не будет работать.

  • @vladimirchizh8853
    @vladimirchizh8853 Год назад

    Хех, я примерно так и понял, слишком уж хорошо отвечает и слишком много всяких штук помнит.

    • @valentynmudryk2869
      @valentynmudryk2869 Год назад

      Без того чтобы помнить, документация не поможет. Это инструмент поддержки

    • @vladimirchizh8853
      @vladimirchizh8853 Год назад +1

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

    • @valentynmudryk2869
      @valentynmudryk2869 Год назад

      @@vladimirchizh8853 SFINAE разное бывает) Что-то можно без подготовки написать, а что-то уже затруднительно

  • @j872-v4q
    @j872-v4q Год назад

    слабоваты вопросы для позиции мидла уж мне кажется

  • @vartan_babayan_4388
    @vartan_babayan_4388 Год назад +4

    КККланг а не СИланг

    • @pavel_trpn
      @pavel_trpn 5 месяцев назад +1

      не душни

  • @ParticleNosedive
    @ParticleNosedive Год назад

    Мда уж

  • @user-ih5hp
    @user-ih5hp 5 месяцев назад +1

    нынче блогеры в прогеры решили податься.....мда. Потом удивляемся почему программы такие тормознутые получаются...
    middle переменную называется a и b...завтра сеньором будет, начнет называть их _a и _b....

    • @ambushedraccoon6408
      @ambushedraccoon6408  4 месяца назад +2

      Не вижу никакой проблемы в том, чтобы назвать переменную a и b, если это используется к месту.
      Пример сигнатура std::swap,
      en.cppreference.com/w/cpp/algorithm/swap
      То, что Вы делает выводы о производительности современного ПО, основываясь только на названиях переменных или самом факте ведения блога, создает впечатление, что у Вас как минимум пробелы в софт скилах.

  • @skynowa2626
    @skynowa2626 11 месяцев назад +1

    Чел сидит и гуглит параллельно

    • @ambushedraccoon6408
      @ambushedraccoon6408  11 месяцев назад

      Не совсем так.
      1:00:38 - тут про это говорю.

  • @АлександрИнженер-д4б

    Какой он унылый, печатает со скоростью секретарши, мидл школьник

  • @sashabroslavskiy7904
    @sashabroslavskiy7904 Год назад

    Как по мне на typescript-е люди посложней решают задачи)) перебирать массивчики это такое себе)) спроси лучше что такое тред пул и как работают форки например)) как пробросить исключение через поток и т.д

    • @vilture5706
      @vilture5706 Год назад

      Так он сказал же, что исключениями не пользуются, а только ловят.
      Зачем тогда это спрашивать? Много где считают, что исключениями пользоваться не надо. Это убивает смысл С++.