zoukankan      html  css  js  c++  java
  • [LeetCode] 359. Logger Rate Limiter 记录速率限制器

    Design a logger system that receive stream of messages along with its timestamps, each message should be printed if and only if it is not printed in the last 10 seconds.

    Given a message and a timestamp (in seconds granularity), return true if the message should be printed in the given timestamp, otherwise returns false.

    It is possible that several messages arrive roughly at the same time.

    Example:

    Logger logger = new Logger();

    // logging string "foo" at timestamp 1
    logger.shouldPrintMessage(1, "foo"); returns true; 

    // logging string "bar" at timestamp 2
    logger.shouldPrintMessage(2,"bar"); returns true;

    // logging string "foo" at timestamp 3
    logger.shouldPrintMessage(3,"foo"); returns false;

    // logging string "bar" at timestamp 8
    logger.shouldPrintMessage(8,"bar"); returns false;

    // logging string "foo" at timestamp 10
    logger.shouldPrintMessage(10,"foo"); returns false;

    // logging string "foo" at timestamp 11
    logger.shouldPrintMessage(11,"foo"); returns true;

    设计一个记录系统每次接受信息并保存时间戳,然后让我们打印出该消息,前提是最近10秒内没有打印出这个消息。Uber家

    解法:哈希表,建立message和timestamp之间映射,如果接收到的消息不在哈希表里,就添加到哈希表里,并返回true。如果已经存在,如果当前时间戳是否比哈希表中保存的时间戳大10秒,则更新哈希表,并返回true,否则返回false。

    Java:

    public class Logger{
        
        HashMap<String, Integer> record;
        
        /** Initialize your data structure here. */
        public Logger() {
            record= new HashMap<String, Integer>();
        }
        
        /** Returns true if the message should be printed in the given timestamp, otherwise returns false.
            If this method returns false, the message will not be printed.
            The timestamp is in seconds granularity. */
        public boolean shouldPrintMessage(int timestamp, String message) {
    /*        if(record.containsKey(message)){
                if( timestamp-record.get(message) >=10){
                    record.put(message, timestamp);
                    return true;
                }
                else{
                    return false;
                }
                
            }
            else{
                record.put(message, timestamp);
                return true;
            }*/  // 以上是非常连贯的逻辑,一步步做判断,下面是 精简后的判断条件,所以速度上快很多,但是如果没写出上面的代码,没看到重复出现的那两行,可能也不会想到下面的写法
            
            if(record.containsKey(message) && timestamp-record.get(message)<10 ){
                return false;
            }
            else{
                record.put(message, timestamp);
                return true;            
            }
            
        }
    }
     
    /**
     * Your Logger object will be instantiated and called as such:
     * Logger obj = new Logger();
     * boolean param_1 = obj.shouldPrintMessage(timestamp,message);
     */  

    Python:

    # Time:  O(1), amortized
    # Space: O(k), k is the max number of printed messages in last 10 seconds
    import collections
    
    class Logger(object):
    
        def __init__(self):
            """
            Initialize your data structure here.
            """
            self.__dq = collections.deque()
            self.__printed = set()
    
        def shouldPrintMessage(self, timestamp, message):
            """
            Returns true if the message should be printed in the given timestamp, otherwise returns false. The timestamp is in seconds granularity.
            :type timestamp: int
            :type message: str
            :rtype: bool
            """
            while self.__dq and self.__dq[0][0] <= timestamp - 10:
                self.__printed.remove(self.__dq.popleft()[1])
            if message in self.__printed:
                return False
            self.__dq.append((timestamp, message))
            self.__printed.add(message)
            return True
    
    
    # Your Logger object will be instantiated and called as such:
    # obj = Logger()
    # param_1 = obj.shouldPrintMessage(timestamp,message)  

    C++:

    class Logger {
    public:
        Logger() {}
        
        bool shouldPrintMessage(int timestamp, string message) {
            if (!m.count(message)) {
                m[message] = timestamp;
                return true;
            } 
            if (timestamp - m[message] >= 10) {
                m[message] = timestamp;
                return true;
            }
            return false;
        }
    
    private:
        unordered_map<string, int> m;
    };
    

    C++:

    class Logger {
    public:
        Logger() {}
        
        bool shouldPrintMessage(int timestamp, string message) {
            if (timestamp < m[message]) return false;
            m[message] = timestamp + 10;
            return true;
        }
    
    private:
        unordered_map<string, int> m;
    };
    

      

      

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    读书笔记:《与爱因斯坦月球漫步》
    在职工象棋赛上弃子拿下一盘
    桥牌笔记:精准叫牌法摘要
    桥牌笔记:探查牌型分布
    在64位环境下开发程序时常遇到的一个错误:无法加载文件或程序集
    我的记忆图像编码
    【转载】新闻周刊:《2012:31个让你变聪明的方法》
    【转译】希望将来孩子评价父亲的35句话
    桥牌笔记:安全打法,保持将牌控制
    被Html的Button标签耍了一次
  • 原文地址:https://www.cnblogs.com/lightwindy/p/9723518.html
Copyright © 2011-2022 走看看