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
给一个整数流和一个窗口,计算在给定大小的窗口里的数字的平均值。
解:
本题思路:
LinkedList.remove() 方法用于取出链表中的第一个值,并将其移除。
功能类似于 Queue.poll() 取出队列中第一支,并将其从队列中删除
每次传入新值的时候判断是否列表数量是否等于最大数量,如果是,则需要将最前面的一个值从列表中去除,然后塞入新值,然后用所有值求和除以当前列表值得数量,求得当前窗口中数字的平均值。
//保存当前窗口数字的总和
private double previousSum = 0.0;
//窗口的最大值
private int maxSize;
//链表用于保存当前窗口的值
private Queue<Integer> currentWindow;
public MovingAverage(int val){
currentWindow = new LinkedList<Integer>();
maxSize = val;
}
private double next(int val){
double sum = 0;
if(maxSize==currentWindow.size()){
previousSum -= currentWindow.remove();
}
currentWindow.add(val);
previousSum =val;
return previousSum/currentWindow.size();
}