[系统设计/OOD] bloomberg 马拉松设计题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[系统设计/OOD] bloomberg 马拉松设计题相关的知识,希望对你有一定的参考价值。
第一个问题问的设计题,一个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); } }
以上是关于[系统设计/OOD] bloomberg 马拉松设计题的主要内容,如果未能解决你的问题,请参考以下文章