记录器速率限制器

时间:2018-12-31 11:45:45

标签: algorithm

设计一个接收消息流及其时间戳的记录器系统,当且仅当在最近10秒钟内未打印每条消息时,才应打印每条消息。

给出一条消息和一个时间戳(以秒为单位),如果应该在给定的时间戳中打印消息,则返回true,否则返回false。

几条消息可能大致同时到达

示例: Logger logger = new Logger();

//在时间戳1处记录字符串“ foo” logger.shouldPrintMessage(1,“ foo”);返回true;

//在时间戳2处记录字符串“ bar” logger.shouldPrintMessage(2,“ bar”);返回true;

//在时间戳记3记录字符串“ foo” logger.shouldPrintMessage(3,“ foo”);返回false;

//在时间戳记8记录字符串“ bar” logger.shouldPrintMessage(8,“ bar”);返回false;

//在时间戳10记录字符串“ foo” logger.shouldPrintMessage(10,“ foo”);返回false;

//在时间戳记11记录字符串“ foo” logger.shouldPrintMessage(11,“ foo”);返回true;

请告诉方法和有关问题。我不明白,谢谢。

2 个答案:

答案 0 :(得分:0)

  

仅当在最近10秒内未打印每条消息时才应打印

这意味着记录器必须跟踪最近10秒钟(或更长)内打印了哪些消息。

这可以通过(例如)消息的链接列表来完成,这样,当接收到一条消息时,您将丢弃列表中任何早于10秒的消息,然后检查新消息是否与某项消息相同仍然在列表中,以决定是忽略新消息还是打印新消息并将其添加到列表中。

答案 1 :(得分:0)

使用HashMap对其进行设计以跟踪时间和消息: 我们检查哈希图中存储的时间之间是否存在差异 并且当前时间戳小于该时间戳,则我们将返回false,否则我们将使用当前时间戳更新哈希映射。

以下是解决方案:

类记录器{

/** Initialize your data structure here. */
private HashMap<String, Integer> map;
public Logger() {
 map = new HashMap<>();
}

/** 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 (!map.containsKey(message)) {
        map.put(message, timestamp);
        return true;
    }
    
    int t1 = map.get(message);
    if (timestamp-t1 < 10) {
        return false;
    }
    map.put(message, timestamp);
    return true;
}

}

/ **

  • 您的Logger对象将被实例化并这样调用:
  • Logger obj = new Logger();
  • 布尔值param_1 = obj.shouldPrintMessage(timestamp,message); * /