码迷,mamicode.com
首页 > 其他好文 > 详细

[系统设计/OOD] bloomberg 马拉松设计题

时间:2017-11-19 11:16:55      阅读:184      评论:0      收藏:0      [点我收藏+]

标签: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);

    }
}

    

[系统设计/OOD] bloomberg 马拉松设计题

标签:solution   map   track   csharp   排序   system   node   tran   linked   

原文地址:http://www.cnblogs.com/apanda009/p/7859006.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!