Подтвердить что ты не робот

Насколько ясен этот вопрос для интервью?

Мы проводим собеседование для старшей Java Development Role, и все три человека, которых мы попросили выполнить этот вопрос, дали нам тот же неправильный ответ. Вопрос был сделан перед интервью, поэтому у них было много времени. Их решения, казалось, сортировали входные данные parentId, а затем childId вместо создания дерева и ввода, а затем пересекали дерево, чтобы найти правильный порядок. Вопрос не достаточно ясен?

Вопрос:

Ниже приведен простой тест навыков и презентаций для роли Java Developer, который должен быть выполнен до телефонного интервью.

ТРЕБУЕТСЯ:

  • Тест JUnit

  • Внедрение интерфейса NodeSorter

Вопрос:

У нас есть объект Java, который выглядит примерно так:

public class Node {

    public int id;
    public Integer parentId;

    public Node(int id, Integer parentId) {
        this.id = id;
        this.parentId = parentId;
    }
}

Например, следующий список Node (s) может отображаться графически как:

Node (id: 1, parentId: null), Node (id: 2, parentId: 1), Node (id: 3, parentId: 1), Node (id: 4, parentId: 2), Node (id: 5, parentId: 3)

              Node (id: 1)
             /            \
            /              \
           /                \
          /                  \
      Node (id: 2)         Node (id : 3)
         /                    \
        /                      \
       /                        \
      /                          \
  Node (id: 4)                 Node (id : 5)

Предположения:

  • Всегда будет хотя бы один Node

  • Будет один и только один Node с нулевым parentId

  • Каждый Node будет иметь действительный parentId, за исключением Node, у которого есть null parentId

Требования:

  • Напишите класс, который реализует следующий интерфейс, который получит список Node (s) и упорядочивает их сверху вниз (узлы, которые выше в дереве, должны быть перед узлами ниже в дереве. Node 1 в верхней части дерева должно быть до Node 4, которое находится в нижней части дерева). Узлы на том же уровне будут в порядке их идентификатора, поэтому Node с id = 2 появится перед Node с id = 3 на диаграмме выше.

Интерфейс:

    public interface NodeSorter {
        public List<Node> sort(List<Node> unSortedNodes);
    }

Данные теста:

Тестовый пример 1:


Диаграмма ввода:

              Node (id: 1)
             /            \
            /              \
           /                \
          /                  \
      Node (id: 2)   Node (id : 3)
         /                    \
        /                      \
       /                        \
      /                          \
  Node (id: 4)           Node (id : 5)

Вход: Node (id: 2, parentId: 1), Node (id: 4, parentId: 2), Node (id: 1, parentId: null), Node (id: 3, parentId: 1), Node (id: 5, parentId: 3)

Вывод: Node (id: 1, parentId: null), Node (id: 2, parentId: 1), Node (id: 3, parentId: 1), Node (id: 4, parentId: 2), Node (id: 5, parentId: 3)

Тестовый пример 2:


Диаграмма ввода:

              Node (id: 1)    
             /            \
            /              \
           /                \
          /                  \
      Node (id: 5)   Node (id : 2)
         /                    \
        /                      \
       /                        \    
      /                          \
  Node (id: 4)           Node (id : 3)

Вход: Node (id: 5, parentId: 1), Node (id: 4, parentId: 5), Node (id: 1, parentId: null), Node (id: 3, parentId: 2), Node (id: 2, parentId: 1)

Вывод: Node (id: 1, parentId: null), Node (id: 2, parentId: 1), Node (id: 5, parentId: 1), Node (id: 3, parentId: 2), Node (id: 4, parentId: 5)

4b9b3361

Ответ 1

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

Каждый элемент в выходном списке является деревом node, но на дереве нет никакого баланса. Не мог пользователь просто читать значения для всех узлов, сортировать их, а затем перебирать отсортированные значения, создавая новые узлы, каждый из которых указывает на предыдущий node, и по существу делаются... они создал сильно неуравновешенное дерево (никаких ветвей), но кому это нужно?

Это кажется правильным для меня, но если бы я брал интервью, я не был бы очень доволен этим ответом, потому что мне было бы интересно, почему дерево было там вообще.

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

Ответ 2

Честно говоря, вопрос кажется мне довольно понятным.

Пробовали ли вы просить их почему они выбрали сортировку по идентификатору списка, а затем node ID? Думали ли они, что решили проблему? Если да, то какова их реакция при столкновении с входом, для которого он не работает?

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

Ответ 3

Как насчет обновления тестовых примеров, чтобы добавить тесты, которые не сработали бы при неверных решениях, которые предоставляются?

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

Ответ 4

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

Ответ 5

В вводе/выводе возникает вопрос.

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

Если полученный в результате код дает ожидаемый результат, то он правильный, даже если они не используют дерево (потому что оно не указано в спецификации), если результат неправильный, решение неверно, даже если они используют Дерево.

Ответ 6

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

Если вы хотите сделать более вероятным, что респонденты получат правильный ответ, тогда вы можете включить тестовый пример, демонстрирующий, что родительские идентификаторы могут быть больше, чем дочерние иды.

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

Ответ 7

Вы можете попросить их вывести узлы в уровне pre-order level-order, чтобы вопрос был кристально чистым.

Ответ 8

Вы приводили примеры ввода и вывода интервьюируемым, как вы это делали в проводке здесь? Если вы просто даете правила без примера, я думаю, кто-то может быть прощен за недоразумение.

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

Единственный реальный недостаток, который я вижу, заключается в том, что мне непонятно, что такое вход. Вы говорите, что вход представляет собой список узлов, видимо, Node объектов, но как у программиста есть уверенность, что этот список узлов фактически образует дерево? Предполагается ли он просто предположить, что это все допустимые данные? Или он должен проверить его? Я думаю, вам лучше сказать, что функция должна принять корень Node дерева, а затем обнаружить, какие узлы существуют путем обхода, вместо того, чтобы сделать двойную проблему с предоставлением списка и заставить программиста понять это.

Это намного лучше, чем большинство вопросов интервью, которые я получил в своей жизни, которые, как правило, имеют такие вопросы, как "Сколько лет у вас есть с...", "Какая ваша самая большая ошибка как сотрудник?" и "У вас есть опыт работы с Foobar версии 3.9.7.6? О, вы использовали только версию 3.9.7.5, извините, мы используем здесь 3.9.7.6".

Мой единственный вопрос: что этот вопрос имеет отношение к тестированию JUnit? Вы начинаете говорить об испытаниях JUnit, но я не вижу, как это относится к этому вообще.

Ответ 9

Вопрос: CLEAR. Вы запрашиваете BFS дерева.

Это интересный вопрос для рассмотрения 1) возможностей абстракции; 2) порядок и стиль программирования 3) уход за порядком алгоритма (большой-O).

Мой ответ за все, что "сколько раз вы делаете это в своей работе":

  • этот вопрос намеревается оценить:
    • способность абстракции
    • фон теории
    • использование структур данных и алгоритмов

Если вы можете это сделать, то вы не простой базовый программист, ориентированный на базы данных.