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

Когда-то давно, я очень хотел работать в этой компании, но много лет назад не очень хорошо прошел собеседование. Хотя, возможно, я действительно был слабоват и плохо решал алгоритмические задачки маркером на доске. С тех пор я неплохо прокачал алгоритмы на литкоде и онлайн контестах.

В соцсетях проскочила реклама One Day Offer Frontend и я решил попробовать. И вот почему:

  • Яндекс делал отличные сервисы. И есть крутые проекты воде беспилотников, хотя это мероприятие яндекс еды, поиска или чего-то такого, не помню точно

  • В ближайшее время планирую активно проходить интервью, и хорошо бы подтянуть софт-скилы.

  • Обратная связь позволяет взглянуть на себя со стороны, увидеть слабые места

  • Не стоит отвергать вероятность хорошего оффера, кто знает какие зарплаты сейчас в it при дефиците кадров

  • Мне всегда нравилось решать задачки

Я зарегистрировался на контест и начал решать. Коротко о правилах - 5 задач на разное количество баллов, на решение дается 3 часа. Все задачи уровнять easy - medium. Условие будет картинкой, чтобы сложнее было нагуглить. Первую пропустим - это одна строчка кода.

Задача 2


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

Задача 3


Классическая задачка на собеседованиях десятилетней давности. Сложно посчитать сколько раз мне ее задавали. Что вы знаете о замыкании? Я немножко знаю - еще 30 баллов в копилку

Задача 4


Звучит очень запутано, но если отфильтровать весь мусор, задача оказывается простой.

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

Основная сложность в том, что результат сложно протестировать, поэтому первым делом я написал мок класс c методами onmessage, postmessage и terminate и реализовал логику, чтобы конструктор через раз выдавал ошибку. Дальше все просто.

Такую задачу я решал пару лет назад на онлайн контесте. Плюс 60 баллов.

Все, необходимое количество баллов набрано. Можно было бы расслабиться, но...

Задача 5


Эту задачу я не решил полностью, первое что я сделал написал ДП алгоритм. Подзадача: если n = 1, а k = числу, которое мы ищем - подзадача решена, если нет - перебираем все числа (>= последнего) рекурсивно вызывая подзадачу. Такой алгоритм дал 59 баллов из 80, я ожидал увидеть ошибку по времени выполнения и оптимизировать мемоизацией. Однако, для некоторых тестов были не правильные ответы.

Было лень искать ошибку. В итоге я не стал мучаться и забил т.к. баллов более чем достаточно, настроение отличное, осталось дождаться собеседований 25 числа.

Несмотря на набранные баллы, собеседование назначено не было. Рекрутер и техподдержка молчат. Пишу это вечером 25-го и что-то мне подсказывает, что собеседований уже не будет.

Штош. Немного грустно, но, кажется, эпоха яндекса уходит. Вроде бы все двигается дальше, по инерции проходят такие-же мероприятия, как и раньше. Но все изменилось, меня не покидает ощущение, что даже сотрудникам уже не важно что там и как проходит. Задачи собраны на скорую руку: одна из подборки для собеседований, другую точно видел раньше. Рекрутер не назначает встречу. Техподдержка молчит. Всем все равно.

Тем не менее я благодарен Яндексу, их отказ много лет назад очень мотивировал меня. Благодаря этому, я прошел много онлайн курсов, прочитал книги по алгоритмам. Меня это сильно увлекло. Такие задачки позволяют отвлечься от реальности, аджайла, дедлайнов, бесконечных ретроспектив, инцидентов. Есть чистое программирование, алгоритмы и О большое.

Комментарии (6)


  1. oWeRQ
    04.07.2022 18:23

    Подзадача: если n = 1, а k = числу, которое мы ищем - подзадача решена,
    если нет - перебираем все числа (>= последнего) рекурсивно вызывая
    подзадачу.

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


    1. Alexandroppolus
      04.07.2022 22:37
      +1

      Количество вариантов считается банальной рекурсией, с мемоизацией. Ну то есть ДП, как верно сказал автор

      Вот, на скорую руку. Проверил на нескольких значениях.

      function calcCount(n, k) {
          const storage = new Map();
      
          function count(n, k, min) {
              if (k < 2) {
                  return n < min || n > 9 ? 0 : 1;
              }
              if (n < min * k || n > 9 * k) {
                  return 0;
              }
              
              const key = n + '_' + k + '_' + min;
              let r = storage.get(key);
              if (r == null) {
                  r = 0;
                  const max = Math.min(Math.ceil(n / k), 9);
                  for (let i = min; i <= max; ++i) {
                      r += count(n - i, k - 1, i);
                  }
                  storage.set(key, r);
              }
              return r;
          }
      
          return count(n, k, 1);
      }


      1. oWeRQ
        05.07.2022 14:36

        Вы правы, я сильно просчитался в сложности, 20 знаков действительно не большая проблема, это далеко не полный перебор.

        Возможная ошибка, с которой столкнулся автор - числа больше MAX_SAFE_INTEGER(9007199254740991 или 16 символов) в js округляются, на конце получаются нули, похоже авторы задачи это не предусмотрели, в результате минимального и максимального значения должно быть или BigInt или строка.


        1. Alexandroppolus
          05.07.2022 18:30

          Вряд ли там длинные числа. Условие гарантирует, что k не более 20. Возможные n при этом до 180, а результаты совсем копеечные - максимум ~61000 вариантов.


          1. oWeRQ
            06.07.2022 11:28

            Я имел ввиду числа на выходе, в примерах это массив чисел, вариантов да, будет меньше, но при k >= 16 буду проблемы с минимальным и максимальным, даже если все считается правильно, ответ вряд ли засчитается:

            > Number('11199999999999999')
            11200000000000000

            P. S. Перечитал условия задачи, там не зря сказано "приведенное к строке", только в примерах все равно числа


  1. vicki-07
    06.07.2022 09:44

    Добрый день! Я Вика, рекрутер из Яндекса. Проверила список и не вижу, чтобы были участники, оставшиеся без обратной связи. Могли бы вы, пожалуйста, представиться? Или снова написать на почту поддержки?