您的位置:首页 > 职场人生

【面试】Liveramp 面试题 面经 城市问题

2017-02-19 05:44 369 查看


以上来自:http://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=138979&pid=2817216&page=1&extra=page%3D1%26filter%3Dsortid%26sortid%3D311%26searchoption%255B3089%255D%255Bvalue%255D%255B5%255D%3D5%26searchoption%255B3089%255D%255Btype%255D%3Dcheckbox%26searchoption%255B3046%255D%255Bvalue%255D%3D28%26searchoption%255B3046%255D%255Btype%255D%3Dradio#pid2817216

题目要求求出距某一节点为1,2,3,4.。。M-1距离的节点数目。

这个题目首先给出了一个用数组存tree的方法。传统方法是用链表方式。这里给出了数组方式。当然如果是二叉树,用数组很好表示,但是这里的树的度并没有限制,最终却存在一个On空间的方法,值得学习。不过这里有一个要求就是节点的值是从0开始连续的值。

任何一个树都可以选择任意一个节点作为root,然后为了表示某一个节点是root,我们可以对该节点做特殊处理,就是让其指向自己,即A[i]=i。对于其余的点,每一层都指向其父节点,A[i]=j,i是子节点,j是父节点。这样正好可以用On的数组来表示整颗树。而且表示方式是唯一的对于每一棵树而言。

解题思路是,按照bfs输出即可。当时为了满徐题目Om的复杂度,需要对tree做处理,因为要找i的孩子节点,在数组的表示下只能遍历,这样复杂度是n2,所以开始先用一个map来存每一个节点的子节点,这样查找就是O1级别的。整体的复杂度是On。

public int[] position(int[] array){
if(array == null) return null;
Map<Integer, List<Integer>> map = new HashMap<>();
Queue<Integer> queue = new LinkedList<>();
for(int i = 0; i < array.length; i++){
int des = array[i];
if(des == i){
queue.add(i);
continue;
}
if(!map.containsKey(des))
map.put(des, new ArrayList<>());
map.get(des).add(i);
}
int[] res = new int[array.length - 1];
int layer = -1;
while(!queue.isEmpty()){
int size = queue.size();
if(layer != -1)
res[layer] = size;
for(int i = 0; i < size; i++){
int des = queue.poll();
List<Integer> list = map.get(des);
if(list != null)
queue.addAll(list);
}
layer++;
}
return res;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  liveramp 面试题