package com.interview.stackqueue;
import java.util.Deque;
import java.util.LinkedList;
public class RealTimeCounterUsingCircularQueue {
class Node {
long time;
int count;
}
private static int MAX_SIZE = 0;
private static int BOUND = 100;
private static int MAX_BOUND = 1000;
int count = 0;
private int currentSize = 0;
Deque<Node> queue = new LinkedList<Node>();
public void add(long time) {
Node last = queue.peekLast();
if(last != null){
if (time - last.time < BOUND) {
last.count++;
count++;
return;
} else if (time - last.time > MAX_BOUND) {
queue.clear();
Node n = new Node();
n.time = time/BOUND * BOUND;
n.count = 1;
queue.add(n);
count++;
return;
}
}
while(queue.size() > 0){
Node t1 = queue.peekFirst();
if(time - t1.time > MAX_BOUND){
count = count - t1.count;
queue.pollFirst();
}else{
break;
}
}
Node n = new Node();
n.time = time/BOUND * BOUND;
n.count = 1;
queue.add(n);
count++;
}
public int getCount(int time){
while(queue.size() > 0){
Node t1 = queue.peekFirst();
if(time - t1.time > MAX_BOUND){
count = count - t1.count;
queue.pollFirst();
}else{
break;
}
}
return count;
}
public static void main(String args[]){
RealTimeCounterUsingCircularQueue src = new RealTimeCounterUsingCircularQueue();
src.add(10);
src.add(70);
src.add(80);
src.add(120);
src.add(150);
src.add(450);
src.add(750);
src.add(799);
src.add(1001);
src.add(1010);
src.add(1210);
System.out.print(src.getCount(1515));
}
}