Как стать автором
Обновить

Impress me или как решить задачу на интервью

Время на прочтение2 мин
Количество просмотров7.1K

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

Поясню. Джуниор разработчик проходит собеседование. Ему дали следующее задание.

Одна из задач, которую мы даём соискателям: написать код, который выводит числа от 0 до 1000, которые делятся на 3, но не делятся на 5, и сумма цифр в которых меньше десяти

Интервьюер хочет убедиться что:

  1. Кандидат знает синтаксис языка программирования.

  2. Он умеет решать алгоритмические задачи в рамках имеющихся ресурсов.

  3. Его не придётся переучивать на стандарты использующиеся в компании.

Разработчик решает следующие проблемы:

  1. Ему нужно выставить себя в лучшем свете

  2. Ему нужно обойти других кандидатов

  3. И в конечном итоге получить вакансию

Давайте попробуем максимизировать пользу для обоих участников процесса.

Решение #1 от @Filex

List<Integer> numList = IntStream.range(MIN, MAX).boxed()
            .filter(i -> (i % GOOD_DIV == 0 && i % BAD_DIV != 0 && checkSumDigits(i)))
            .toList();

Интервьюер:

Начинающий программист демонстрирует навыки функционального программирования.Ну ок, начитанный. Но сможет ли он писать код без ошибок в реальной жизни? ФП сравнительно новая концепция, тем более в применении к языку ООП. Вряд ли в нашем legacy это пригодится.

Кандидат:

Я вижу что интервьюер хмурится. Я быстренько говорю что это моё хобби, для роста. И накидываю более традиционное решение

Решение #2 от @pin2t

for (int i = 0; i < 1000; i++) {
            if (i % 3 == 0 && i % 5 != 0 && (i / 100 + (i / 10) % 10 + i % 10) < 10) {
                out.println(i);
            }
        }

Интервьер:

Решение вполне себе рабочее, но уж слишком примитивное. Сможет ли начинающий программист расти? Понимает ли он что всякое число в коде это потенциальная проблема?

Кандидат:

Это я вам набрасал интуитивное решение. В реальной жизни я бы так поступил когда нужно срочно сделать прототип и показать заказчику. Потом разумеется будут написаны тесты и код будет приведён в соответствии со стандартами.

Решение #3 от @igolikov

for (int i = 3; i <= 1000; i += 3) {
            if (i % 5 != 0 && check(i)) {
                System.out.println(i);
            }
        }

Интервьер:

Молодец, отсеял 2/3 заведомо неправильных решений, оптимизировать может. Но циклы в Java вполне себе оптимизированы, а вот деление операция долгая. Тут оно не нужно в принципе. Начал с тройки, но почему упустил 1000, оно же не делится на три. Кандидат думает, но не вникает в детали.

Кандидат:

Тут либо всё делаешь аккуратно, либо не лезешь в предварительную оптимизацию которая есть зло.

Ну и моё решение

for (int i = 0; i < 10; ++i)
  for (int j = 0; j + i < 10; ++j)
     for (int k = 0; i + j + k < 9; ++k)
        if (k == 5 || k ==0)
           continue;
        if (i + j + k != 3 && i + j + k != 6)
           continue;

        print(i * 100 + j * 10 + k)

Интервьюер:

Кандидат знает, как работают процессоры. Он вникает в суть задачи. Может быть немного overqualified, но есть потенциал роста. Но сможет ли он писать поддерживаемый код?

Кандидат:

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

Теги:
Хабы:
Всего голосов 6: ↑4 и ↓2+4
Комментарии31

Публикации

Истории

Работа

Java разработчик
394 вакансии

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
10 – 11 октября
HR IT & Team Lead конференция «Битва за IT-таланты»
МоскваОнлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн