标签:solution map track csharp 排序 system node tran linked
第一个问题问的设计题,一个track上有很多runner,还有10个sensor,sensor可以检测到那个runner跑过了这个sensor
用这个系统生成一个dashboard显示runner现在的名次。
solution 1:
1. 用一个2D array(int[][] ranking , m * n)记录runner跑到哪了,以及一个长 m 的array(int[] counter)记录已有多少个runner经过当前sensor。
2. 每次update(i,j),ranking[j-1][i] = 0, ranking[j][i] = counter[i]+1;
3. 每次getRank(k),从下往上遍历每个sensor,还需将每一行根据ranking[][]的大小排序,拿出前k个。
这用做也许在m,n都比较小的时候可以,但随着m,n增多很不方便。
主要问题是,如何保持每个sensor所“拥有”的runner有先后顺序(如queue),在先后顺序的前提下如何快速删除其中某一个runner(突然跑快了),并append到下一个sensor的队列中;为了取前k个runner,当sensor较多runner比较稀疏时,如何取了一部分后知道下一个有runner的sensor是谁。
solution 2:基于double linked list, hashmap
1. 建立一个HashMap<Runner, Node>, 每个runner对应一个node,O(1)时间找到这个此runner的位置
2. 每个sensor都建立double linked list,O(1)时间删除,且始终有序。删除后加入更新的sensor链尾即可,update时间O(1)
3. 建立另一个长 k 的 double linked list,每个node代表一个sensor,将稀疏的sensor连起来
4. getRank(k)时,依次将每个sensor node中选手按许倒出即可,O(k)
class Node {
String name;
int id;
Node pre = null;
Node next = null;
public Node(String name, int id) {
this.name = name;
this.id = id;
}
}
class Solution {
Node[] nodes = new Node[10];
HashMap<String, Node> map = new HashMap<>();
public Solution() {
for (int i = 0; i < 10; i++) {
Node head = new Node("" + i, -1);
Node tail = new Node("" + i, -1);
head.next = tail;
tail.pre = head;
nodes[i] = head;
}
}
public void update(String name, int sensor) {
Node cur = new Node(name, sensor);
if (map.containsKey(name)) {
Node old = map.get(name);
old.pre.next = old.next;
old.next.pre = old.pre;
}
map.put(name, cur);
move(cur, sensor);
}
public void topK(int k) {
for (int i = 9; i >= 0; i--) {
Node cur = nodes[i].next;
while (cur.id != -1 && k > 0) {
System.out.println(cur.name);
k--;
cur = cur.next;
}
}
}
public void move(Node node, int sensor) {
nodes[sensor].next.pre = node;
node.next = nodes[sensor].next;
nodes[sensor].next = node;
node.pre = nodes[sensor];
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Solution sol = new Solution();
sol.update("a", 1);
sol.update("b", 1);
sol.topK(2);
System.out.println();
sol.update("c", 1);
sol.update("b", 2);
sol.update("c", 2);
sol.topK(2);
System.out.println();
sol.update("b", 3);
sol.topK(1);
System.out.println();
sol.update("a", 2);
sol.topK(3);
}
}
标签:solution map track csharp 排序 system node tran linked
原文地址:http://www.cnblogs.com/apanda009/p/7859006.html