【Lintcode】1786. Pub Sub Pattern

記錄演算法發表於2020-12-02

題目地址:

https://www.lintcode.com/problem/pub-sub-pattern/description

要求實現一個釋出/訂閱模式。實現下面功能:
1、subscribe(channel, user_id):將給定使用者訂閱到給定頻道。
2、unsubscribe(channel, user_id):取消訂閱給定使用者的給定使用者。
3、publish(channel, message):您需要將訊息釋出到頻道,以便在頻道上訂閱的每個人都會收到此訊息。 呼叫PushNotification.notify(user_id, message)將訊息推送給使用者。

思路是雜湊表,key是channel名,value是個HashSet,存訂閱這個channel的user_id。程式碼如下:

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class PubSubPattern {
    
    private Map<String, Set<Integer>> map;
    
    public PubSubPattern() {
        // Write your code here
        map = new HashMap<>();
    }
    
    /**
     * @param channel: the channel's name
     * @param user_id: the user who subscribes the channel
     * @return: nothing
     */
    public void subscribe(String channel, int user_id) {
        // Write your code here
        map.putIfAbsent(channel, new HashSet<>());
        map.get(channel).add(user_id);
    }
    
    /**
     * @param channel: the channel's name
     * @param user_id: the user who unsubscribes the channel
     * @return: nothing
     */
    public void unsubscribe(String channel, int user_id) {
        // Write your code here
        Set<Integer> set = map.get(channel);
        if (set != null && !set.isEmpty()) {
            set.remove(user_id);
        }
    }
    
    /**
     * @param channel: the channel's name
     * @param message: the message need to be delivered to the channel's subscribers
     * @return: nothing
     */
    public void publish(String channel, String message) {
        // Write your code here
        Set<Integer> set = map.get(channel);
        if (set != null && !set.isEmpty()) {
            for (int user_id : set) {
                PushNotification.notify(user_id, message);
            }
        }
    }
}

class PushNotification {
    public static void notify(int user_id, String the_message) {}
}

所有操作時間複雜度 O ( 1 ) O(1) O(1),空間與具體所有頻道共多少人訂閱有關。

相關文章