给定一个整数流和一个窗口的大小,根据滑动窗口的大小,计算其所有整数的移动平均值。
例如:
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添加数字并计算平均值
- 超过窗口的大小,最先添加的数字需要先移除(队列的特点:先进先出)
解题思路
- 使用队列来添加数字
- 通过添加成员变量来保存计算的值
算法流程
- 新增数值,正常入队
- 累加整数并保存结果
- 如果队列的长度超过窗口的长度,则减去最先进入队列的元素,然后让最先进入队列的元素出队
- 返回平均值
示例代码
<script>
class Queue {
constructor() {
this.queue = [];
}
// 入队
enQueue(item) {
this.queue.push(item);
}
// 出队
deQueue() {
this.queue.shift();
}
//查询队头的元素
getHeader() {
return this.queue[0];
}
//获取队的长度
getSize() {
return this.queue.length;
}
//队的非空判断
isEmpty() {
return this.getSize() === 0;
}
}
var MovingAverage = function (size) {
// 定义窗口的大小
this.windowSize = size;
this.queue = new Queue();
//定义一个sum,用来装三个数的和
this.sum = 0;
};
MovingAverage.prototype.next = function (val) {
//这里分两种情况
// 1,不超出窗口的大小,正常入队,求和,平均值
// 2、队列的长度超出窗口的大小,将总和减去队头的元素求平均值
// 同时将队头出队
if (this.queue.getSize() >= this.windowSize) {
this.sum -= this.queue.getHeader();
// 队头元素出队
this.queue.deQueue();
}
this.queue.enQueue(val);
this.sum += val;
return this.sum / this.queue.getSize();
};
var m = new MovingAverage(3);
console.log(m.next(1));
console.log(m.next(10));
console.log(m.next(3));
console.log(m.next(5));
</script>