日志速率限制器
难度:
标签:
题目描述
代码结果
运行时间: 75 ms, 内存: 23.1 MB
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
class Logger {
// 使用 ConcurrentHashMap 存储每条消息和它最近一次打印的时间戳
private ConcurrentHashMap<String, AtomicInteger> messageTimestampMap;
/** 初始化 logger 对象 */
public Logger() {
messageTimestampMap = new ConcurrentHashMap<>();
}
/**
* 判断是否应该打印消息
* @param timestamp 当前时间戳(秒)
* @param message 消息内容
* @return 是否应该打印消息
*/
public boolean shouldPrintMessage(int timestamp, String message) {
return messageTimestampMap.compute(message, (key, value) -> {
if (value == null || timestamp - value.get() >= 10) {
return new AtomicInteger(timestamp);
}
return value;
}).get() == timestamp;
}
}
解释
方法:
该题解使用了一个字典 dct 来记录每个消息上一次打印的时间戳。当收到一个新的消息打印请求时,先检查字典中是否已有该消息的记录:如果没有记录,则将当前时间戳记录到字典中,并返回 True 表示可以打印;如果有记录,则比较当前时间戳与字典中记录的上一次打印时间戳之差是否大于等于 10,如果是则更新字典中的时间戳并返回 True,否则返回 False 表示不应打印。
时间复杂度:
O(1)
空间复杂度:
O(M),其中 M 是不同消息的数量