[系统设计/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 马拉松设计题的主要内容,如果未能解决你的问题,请参考以下文章

OOD 面向对象设计规范(总结)

# 61条面向对象设计的经验原则-《OOD启思录》Arthur J.Riel

Python基础篇第十三篇:面向对象

OOD

面向对象设计(OOD)七大原则

学习笔记ABAP OOD设计模式 - 单例模式