362. Design Hit Counter
Problem:
timestamp是不能回去查看的,如果到了301,就不能查看301之前的了。这个需求没弄懂,就没做出来。用queue谁都想得到。
Solution 1 (Queue):
offer timestamp to queue when hitting. Poll timestamp out of queue if not within 5 min while getting.
Use two arrays.
hits[]: hits[i] means how many hits on index i.
times[]: times[i] means the timestamp on index i.
hit(1) twice: hits[1] = 2, times[1] = 2
hit(301) once: hits[1] = 1, times[1] = 1.
Since we only need most 300 recent hits, when the timestamp exceeds 300. We can need to update timestamp % 300's position in hits and times.
如果当前timestamp和times里面存的不一样,说明当前hit超过了300,之前所有hit不算,需要更新hit为1。 比如times[5] == 5, 当timestamp到305的时候,就不要对于的hits[5]清空为1。
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);Analysis:
timestamp是不能回去查看的,如果到了301,就不能查看301之前的了。这个需求没弄懂,就没做出来。用queue谁都想得到。
Solution 1 (Queue):
offer timestamp to queue when hitting. Poll timestamp out of queue if not within 5 min while getting.
class HitCounter { Queue<Integer> queue; /** Initialize your data structure here. */ public HitCounter() { queue = new LinkedList<>(); } /** Record a hit. @param timestamp - The current timestamp (in seconds granularity). */ public void hit(int timestamp) { queue.offer(timestamp); } /** Return the number of hits in the past 5 minutes. @param timestamp - The current timestamp (in seconds granularity). */ public int getHits(int timestamp) { while (!queue.isEmpty() && timestamp - queue.peek() >= 300) { queue.poll(); } return queue.size(); } } /** * Your HitCounter object will be instantiated and called as such: * HitCounter obj = new HitCounter(); * obj.hit(timestamp); * int param_2 = obj.getHits(timestamp); */Solution 2 (Array):
Use two arrays.
hits[]: hits[i] means how many hits on index i.
times[]: times[i] means the timestamp on index i.
hit(1) twice: hits[1] = 2, times[1] = 2
hit(301) once: hits[1] = 1, times[1] = 1.
Since we only need most 300 recent hits, when the timestamp exceeds 300. We can need to update timestamp % 300's position in hits and times.
如果当前timestamp和times里面存的不一样,说明当前hit超过了300,之前所有hit不算,需要更新hit为1。 比如times[5] == 5, 当timestamp到305的时候,就不要对于的hits[5]清空为1。
class HitCounter { int[] hits; int[] times; /** Initialize your data structure here. */ public HitCounter() { hits = new int[300]; times = new int[300]; } /** Record a hit. @param timestamp - The current timestamp (in seconds granularity). */ public void hit(int timestamp) { int index = timestamp % 300; if (times[index] != timestamp) { times[index] = timestamp; hits[index] = 1; } else { hits[index]++; } } /** 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; } } /** * Your HitCounter object will be instantiated and called as such: * HitCounter obj = new HitCounter(); * obj.hit(timestamp); * int param_2 = obj.getHits(timestamp); */
评论
发表评论