资讯专栏INFORMATION COLUMN

359. Logger Rate Limiter & 362. Design Hit Cou

go4it / 1069人阅读

摘要:题目链接和基本一样,都可以用,但是大了之后会有很多无效的时间保存在里面,要的话,可能需要遍历或者用辅助,时间复杂度超过,所以用一个来做,每次根据新的改变。

359. Logger Rate Limiter

题目链接:https://leetcode.com/problems...

和Design Hit Counter基本一样,都可以用hashmap,但是timestamp大了之后会有很多无效的时间保存在hashmap里面,要remove的话,可能需要遍历hashmap或者用list辅助,时间复杂度超过O(1),所以用一个rotate array来做,每次根据新的timestamp改变array。

public class Logger {
    Set[] record;
    int[] times;
    public Logger() {
        record = new Set[10];
        for(int i = 0; i < record.length; i++) record[i] = new HashSet();
        times = new int[10];
        Arrays.fill(times, -10);
    }
    
    /** 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) {
        for(int i = 0; i < times.length; i++) {
            if(timestamp - times[i] < 10 && record[i].contains(message)) {
                return false;
            }
        }
        int index = timestamp % 10;
        if(timestamp - times[index] >= 10) {
            // rotate
            times[index] = timestamp;
            record[index] = new HashSet();
        }
        record[index].add(message);
        return true;
    }
}
362. Design Hit Counter

题目链接:https://leetcode.com/problems...

public class HitCounter {

    /** Initialize your data structure here. */
    int[] times;
    int[] hits;
    public HitCounter() {
        times = new int[300];
        hits = new int[300];
    }
    
    public void hit(int timestamp) {
        if(times[timestamp%300] != timestamp) {
            times[timestamp%300] = timestamp;
            hits[timestamp%300] = 1;
        }
        else hits[timestamp%300]++;
    }
    
    /** Return the number of hits in the past 5 minutes.
        @param timestamp - The current timestamp (in seconds granularity). */
    public int getHits(int timestamp) {
        int count = 0;
        for(int i = 0; i < 300; i++) {
            if(timestamp - times[i] < 300) {
                count += hits[i];
            }
        }
        return count;
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66646.html

相关文章

  • 使用Envoy 作Sidecar Proxy的微服务模式-5.rate limiter

    摘要:为安装过滤器的侦听器上的每个新请求调用服务,路由表指定应调用服务。使用了令牌桶算法来限流。 本博客是深入研究Envoy Proxy和Istio.io 以及它如何实现更优雅的方式来连接和管理微服务系列文章的一部分。 这是接下来几个部分的想法(将在发布时更新链接): 断路器(第一部分) 重试/超时(第二部分) 分布式跟踪(第三部分) Prometheus的指标收集(第四部分) rate ...

    CocoaChina 评论0 收藏0
  • Spring Cloud Gateway限流实战

    摘要:欢迎访问我的欢迎访问我的内容所有原创文章分类汇总及配套源码,涉及等本篇概览本篇概览本文是实战系列的第八篇,经过前面的学习,咱们对过滤器已了解得差不多,今天来补全过滤器的最后一个版块限流默认的限流器是基于实现的,限流算法是大家熟悉的令牌桶关于欢迎访问我的GitHubhttps://github.com/zq2599/blog_demos内容:所有原创文章分类汇总及配套源码,涉及Java、Doc...

    stonezhu 评论0 收藏0
  • Sails.js 内存暴涨 &amp; 源码分析

    摘要:是下的一个优秀的框架,但是使用后,在流量增长时,进程有时突然内存暴涨保持高占用。如果是内存泄露引起的,则需要细心检查代码,确定变量能正常回收。每个对象有自己产生的内存。译注但是大对象内存区本身不是可执行的内存区。 Sails.js 是 node 下的一个优秀的 MVC 框架,但是使用 Sails 后,在流量增长时, node 进程有时突然内存暴涨、保持高占用。经过翻阅源码后,发现这个问...

    antz 评论0 收藏0
  • python前后文管理工具合同的完成

      本文关键阐述了python前后文管理工具合同的完成,在python中所有完成了前后文管理工具协议书目标都能用应用with实际操作,with开启了目标前后文管理工具  序言  在前后文管理工具协议书的过程当中,牵涉到2个魔术师方式__enter__方法与__exit__方式  在python中所有完成了前后文管理工具协议书目标都能用应用with实际操作  with开启了目标前后文管理工具  前后...

    89542767 评论0 收藏0
  • 接口限流算法:漏桶算法&amp;令牌桶算法

    摘要:令牌桶算法漏桶算法漏桶漏桶的出水速度是恒定的,那么意味着如果瞬时大流量的话,将有大部分请求被丢弃掉也就是所谓的溢出。 工作中对外提供的API 接口设计都要考虑限流,如果不考虑限流,会成系统的连锁反应,轻者响应缓慢,重者系统宕机,整个业务线崩溃,如何应对这种情况呢,我们可以对请求进行引流或者直接拒绝等操作,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机。 在开发高并发...

    dendoink 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<