Given a stream of integers and a window size, calculate the moving average of all integers in the sliding window.
For example,
MovingAverage m = new MovingAverage(3);
m.next(1) = 1
m.next(10) = (1 + 10) / 2
m.next(3) = (1 + 10 + 3) / 3
m.next(5) = (10 + 3 + 5) / 3
可以發現規律,數字長度不能超過定義的初始大小, 否則舍棄最開始的部分, 很明顯要用到先進先出的隊列。
public class MovingAverage {?
? ? ?Queue<Integer> queue;
? ? ?int queue_size;
? ? ?double sum = 0;
? ? ?public MovingAverage(int size) {
? ? ? ? ? ? ? ?queue = new LinkedList<>();
? ? ? ? ? ? ? ?queue_size = size;
? ? ?}
? ? ?public double next(int val) {
? ? ? ? ? ? ? ?sum += val;
? ? ? ? ? ? ? ?queue.offer(val);
? ? ? ? ? ? ? ?if(queue.size() > queue_size){
? ? ? ? ? ? ? ? ? ? ? ?sum -= queue.poll();
? ? ? ? ? ? ? ? ? ? ? ?return sum/queue_size;
? ? ? ? ? ? ? ?}else{
? ? ? ? ? ? ? ? ? ? ? ?return sum/queue.size();
? ? ? ? ? ? ? ?}
? ? ?}
}