我们正在面试高级Java开发角色,我们要求完成此问题的所有三个人都给出了同样错误的答案。问题是在面试之前完成的,所以他们有很多时间。他们的解决方案似乎是通过parentId和childId对输入进行排序,而不是从输入创建树,然后遍历树以找到正确的顺序。问题不够明确吗?
问题:
以下是Java开发人员角色的简单技能和演示测试,必须在电话访问之前完成。
REQUIRED:
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(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)
假设:
总会有至少一个节点
将有一个且只有一个节点具有null parentId
每个节点都有一个有效的parentId,但具有null parentId的节点除外
要求:
接口:
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)
输出:节点(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)
输出:节点(id:1,parentId:null),Node(id:2,parentId:1),Node(id:5,parentId:1),Node(id:3,parentId:2),Node (id:4,parentId:5)
答案 0 :(得分:14)
我想说这很不清楚。您需要一个未排序的输入列表和一个排序列表作为输出。
输出列表中的每个项目都是树节点,但树上没有强制执行平衡。用户不能只读入所有节点的值,对它们进行排序,然后循环创建新节点的排序值,每个节点都指向前一个节点,并且基本上完成...他们创建了一个节点非常不平衡的树(没有分支),但是谁在乎呢?
这对我来说似乎是正确的,但如果我接受采访,我会对这个答案感到非常满意,因为我会想知道为什么树在那里。
这个问题中没有任何内容告诉我,我应该做任何你喜欢的事情:“创建一个树,然后从输入然后遍历树以找到正确的顺序。”
答案 1 :(得分:11)
老实说,这个问题对我来说非常清楚。
您是否尝试过询问为什么他们选择按列表ID排序,然后选择节点ID?他们认为这解决了问题吗?如果是这样,当他们遇到不起作用的输入时他们的反应是什么?
即使他们没有正确回答问题,通过向他们提出这些问题,你可以更多地了解他们并理解你的问题中的内容不够明确。
答案 2 :(得分:9)
如果在提供错误的解决方案的情况下更新测试用例以添加会失败的测试,那该怎么办?
这似乎是让问题更清晰的明显方法。如果他们仍然不理解这个问题,或者发现问题/测试用例不明确,他们可以在完成解决方案之前请求其他信息。
答案 3 :(得分:4)
在我看来,你基本上要求他们根据两个因素对列表进行排序 - 父ID和列表ID。如果是这种情况,您可以简化问题而不用担心整个“树结构”的想法,只要求他们根据两个因素为列表编写一个排序。
答案 4 :(得分:4)
输入/输出中的问题很清楚。
未指定在实现中应使用哪种数据结构或算法,因此可以使用任何数据结构或算法(这是好的)。
如果结果代码给出了预期的输出,那么它是正确的,即使它们不使用树(因为它不在规范中)如果输出错误,解决方案是错误的,即使它们使用一棵树。
答案 5 :(得分:4)
我认为问题本身很清楚,但是在测试用例中选择数据会导致人们尝试不正确的解决方案(按照parentid排序)。也许这是故意的?
如果您希望受访者更有可能得到正确答案,那么您可以添加一个测试用例,证明父ID可能比子ID大。
我不确定这会改善这个作为面试问题,但是:似乎所写的问题有利于测试某人是否有能力提出一个对所有情况都正确的解决方案,而不仅仅是样本他们提供。
答案 6 :(得分:3)
您可以要求他们以预订级别顺序输出节点,这样问题就会非常明确。
答案 7 :(得分:0)
您是否像在此处发帖一样向受访者提供输入和输出的示例?如果你只是在没有例子的情况下给出规则,我认为有人可能会因为误解而被宽恕。
就个人而言,我认为这是一个很好的问题。这很简单,你不是要求申请人花费数天时间来处理它,它有一个明确的,定义明确的正确输出,并且正确的解决方案展示了如何操纵数据结构的知识,这对于一个好的非常基础开发商。而且我看到你说你在电话采访之前要求申请人这样做,我认为这意味着在家里做,所以他们不是坐在一个面试的房间里,在他们挣扎的时候盯着他们因此受到人为的压力
我看到的唯一真正的缺陷是我不清楚输入是什么。你说输入是一个节点列表,显然是Node对象,但程序员如何确保这个节点列表实际上形成了一个树呢?他是否应该简单地假设它都是有效的输入?或者他应该验证它?我认为你最好说这个函数必须接受树的根节点,然后通过遍历发现存在哪些节点,而不是提出提供列表的双重问题,并迫使程序员理解它。
这比我生活中遇到的大多数面试问题要好得多,这些问题往往是“你有多少年的经历......”,“你最大的错误是什么?员工?“和”你有Foobar版本3.9.7.6的经验吗?哦,你只使用版本3.9.7.5,对不起,我们在这里使用3.9.7.6。“
我唯一的狡辩是,这个问题与JUnit测试有什么关系?你开始说它是关于JUnit测试的,但我根本没有看到它与它的关系。
答案 8 :(得分:0)
问题是 CLEAR 。你要求树的BFS。
回顾1)抽象能力是一个有趣的问题; 2)编程中的顺序和风格3)关注算法顺序(big-O)。
我的回答是“你在工作中做了多少次”评论是:
如果你能做到这一点,那么你就不是一个简单的面向数据库系统的基础程序员。