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
思路:
首先建立一个队列,在next()方法中将每次传进的数据入队,求和(sum=sum+value),然后判断:当队列size大于窗口size时,sum减去队头数据大小且队头出队。next()返回 和(sum)/ 队列长度(queue.size)。
注意事项:
- sum为double类型。
- 因为队未满窗口size时,除数不是窗口size,所以平均数应该为sum/queue.size();
代码
public class Queue346 {
private Queue<Integer> queue;
private int size;
private double sum = 0;
public Queue346(int size) {
queue = new LinkedList<Integer>();
this.size = size;
this.sum = sum;
}
public double next(int value) {
sum = sum + value;
queue.offer(value);
if (queue.size() > size) {
sum = sum - queue.poll();
}
return sum / queue.size();
}
public static void main(String args[]) {
Queue346 test = new Queue346(3);
System.out.printf("%.3f\n",test.next(1));
System.out.printf("%.3f\n",test.next(10));
System.out.printf("%.3f\n",test.next(3));
System.out.printf("%.3f\n",test.next(5));
}
}