我最近接受了电话采访。它涉及对问题进行编码作为过程的一部分。
问题是 the 的一个变体,Find the most closest common ancestor of a tree
但有一个转折。这棵树很像图,即可以连接子节点。例子:
A
/
B
| \
C E
| |
D F
\ /
G
在这种情况下,给定这棵树和节点F
以及D
由此产生的最接近的公共 ansestor 将是B
. 第二个转折是树以数组的形式呈现。要实现的方法具有以下输入:
public String getCA(String[] nodes, String[][] parentNodes, String targetNode1, String targetNode2)
在此示例中nodes
={"G", "F", "E", "D", "C", "B", "A"}
和parentNodes
={{"F","D"},{"E"}, {"B"}, {"C"}, {"B"}, {"A"}, null}
基本上对于nodes[i]
父级是parentNodes[i]
.
老实说,我完全惊慌失措(本来就很紧张),花了很长时间才找到答案。
虽然我认为这是递归解决的,但我以某种方式提出了一个迭代解决方案,据我所知,它是可行的:我将节点推入队列,然后首先为第一个目标节点走上路径,然后是第二个节点。一旦我找到一个已经遇到的节点,我就会认为它是解决方案(添加了注释以清除问题)。
public String getCA(String[] nodes, String[][] parentNodes, String targetNode1, String targetNode2) {
if(nodes == null || parentNodes == null){
throw new IllegalArgumentException();
}
Map<String, String[]> map = new HashMap<String, String[]>();
for(int i = 0; i < nodes.length; i++){
map.put(nodes[i], parentNodes[i]);
}
//These are the parents visited as we go up
Set<String> parentsSeen = new HashSet<String>();
parentsSeen.add(targetNode1);
Queue<String> path = new LinkedList<String>();
String[] parents = map.get(targetNode1);
//The root is the common parent
if(parents == null){
return targetNode1;
}
//Build the path up
for(String parent:parents){
path.add(parent);
}
while(!path.isEmpty()){
String currentParent = path.remove();
parentsSeen.add(currentParent);
parents = map.get(currentParent);
if(parents == null){
continue;
}
for(String parent:parents){
path.add(parent);
}
}
parents = map.get(targetNode2);
//It is the root, so it is the common parent
if(parents == null){
return targetNode2;
}
//Start going up for the targetNode2. The first parent that we have already visited is the common parent
for(String parent:parents){
if(parentsSeen.contains(parent)){
return parent;
}
path.add(parent);
}
while(!path.isEmpty()){
String currentParent = path.remove();
if(parentsSeen.contains(currentParent)){
return currentParent;
}
parents = map.get(currentParent);
if(parents == null){
continue;
}
for(String parent:parents){
path.add(parent);
}
}
return null;
}
我没有接到前进的电话。现在由于我是“自学成才”的事实,我有兴趣了解我是如何在这里搞砸的。由于这是技术问题,我相信这不是主观问题,希望我能从有经验的人那里得到帮助。
那么作为同事程序员,您将如何处理问题以及如何评估我的解决方案?我需要做什么来提高我的技能?
你可以尽可能的直截了当。只要我能理解出了什么问题并学会了我就满足了