zoukankan      html  css  js  c++  java
  • 362. Design Hit Counter

    package LeetCode_362
    
    import java.util.*
    import kotlin.collections.HashMap
    
    /**
     * 362. Design Hit Counter
     * (Prime)
     * Design a hit counter which counts the number of hits received in the past 5 minutes.
    Each function accepts a timestamp parameter (in seconds granularity) and you may assume that calls are being made to the system in chronological order (ie, the timestamp is monotonically increasing).
    You may assume that the earliest timestamp starts at 1.
    It is possible that several hits arrive roughly at the same time.
    Example:
    HitCounter counter = new HitCounter();
    // hit at timestamp 1.
    counter.hit(1);
    // hit at timestamp 2.
    counter.hit(2);
    // hit at timestamp 3.
    counter.hit(3);
    // get hits at timestamp 4, should return 3.
    counter.getHits(4);
    // hit at timestamp 300.
    counter.hit(300);
    // get hits at timestamp 300, should return 4.
    counter.getHits(300);
    // get hits at timestamp 301, should return 3.
    counter.getHits(301);
    Follow up:
    What if the number of hits per second could be very large? Does your design scale?
     * */
    class Solution {
        /*
        * solution, HashMap + Queue
        * */
    
        //key: timestamp, value: Node that contains timestamp and hit count with same timestamp
        val map = HashMap<Int, Node>()
        val queue = LinkedList<Node>()
    
        /**
         * Record a hit.
        @param timestamp - The current timestamp (in seconds granularity).
         */
        fun hit(timestamp: Int) {
            if (map.containsKey(timestamp)) {
                val node = map.get(timestamp)
                node!!.count++
            } else {
                val node = Node()
                node.timestamp = timestamp
                node.count = 1
                queue.add(node)
                map.put(timestamp, node)
            }
            //check if need remove
            removeOld(timestamp)
        }
    
        /**
         * Return the number of hits in the past 5 minutes.
        @param timestamp - The current timestamp (in seconds granularity).
         */
        fun getHits(timestamp: Int): Int {
            //check if need remove
            removeOld(timestamp)
            var sum = 0
            for (node in queue) {
                sum += node.count
            }
            return sum
        }
    
        /**
         * check timestamp in queue if > 300s (5 minutes), if true, remove it
         * */
        private fun removeOld(timestamp: Int) {
            while (queue.isNotEmpty()) {
                val cur = queue.peek()
                if (timestamp - cur.timestamp >= 300) {
                    queue.poll()
                    map.remove(cur.timestamp)
                } else {
                    break
                }
            }
        }
    }
    
    class Node {
        var timestamp = 0
        var count = 0
    }
  • 相关阅读:
    win10企业版激活密钥
    百科知识 手机QQ的视频如何保存
    华为荣耀7手机如何开启开发者模式,开启调试模式
    C#如何设置控件水平对齐,垂直对齐
    C#如何实现挂机锁
    JAVA_MyEclipse常见配置NETGEAR路由器如何设置
    JAVA_MyEclipse如何加载Tomcat
    VC++_错误 无法打开包括文件“glglut.h” No such file or directory 怎么办
    生活娱乐 达尔优的键盘鼠标如何打开和关闭呼吸灯
    新版的豌豆荚如何连接电脑
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/14271457.html
Copyright © 2011-2022 走看看