题目描述补充
题目:数据流滑动窗口平均值
给定一个整数数据流和一个滑动窗口的大小,你需要设计一个滑动窗口,使得它能够从数据流中持续接收新整数,并返回滑动窗口内所有整数的平均值。数据流中的整数可以逐一到来,而窗口的大小是固定的。当窗口中的元素数量超出窗口大小时,旧元素应从窗口中移除,同时添加新元素。
输入
- 数据流中的整数,逐个输入。
- 滑动窗口的大小,一个整数,表示窗口中可以包含的元素数量。
输出
- 每当窗口中的元素发生变化(添加新元素或移除旧元素)时,输出新的窗口平均值。
示例
假设滑动窗口的大小为 3,数据流中的整数依次为 [1, 3, -1, -3, 5, 3, 6, 7]
。
- 初始窗口为空,无法计算平均值。
- 添加
1
,窗口变为[1]
,平均值是1/1 = 1
。 - 添加
3
,窗口变为[1, 3]
,平均值是(1+3)/2 = 2
。 - 添加
-1
,窗口变为[1, 3, -1]
,平均值是(1+3-1)/3 = 1
。 - 移除
1
,添加-3
,窗口变为[3, -1, -3]
,平均值是(3-1-3)/3 = -1/3
。 - 以此类推,继续添加后续整数并计算窗口平均值。
示例代码
PHP
class MovingAverage {
private $window;
private $sum;
private $capacity;
function __construct($size) {
$this->window = [];
$this->sum = 0;
$this->capacity = $size;
}
function next($val) {
$this->sum -= array_shift($this->window); // 如果窗口不为空,移除旧元素并更新总和
$this->window[] = $val;
$this->sum += $val;
if (count($this->window) > $this->capacity) {
$this->sum -= array_shift($this->window); // 确保窗口大小不超过容量
}
return $this->sum / count($this->window);
}
}
// 使用示例
$obj = new MovingAverage(3);
echo $obj->next(1); // 1
echo $obj->next(3); // 2
echo $obj->next(-1); // 1
echo $obj->next(-3); // -1/3 或转换为浮点输出
Python
class MovingAverage:
def __init__(self, size):
self.window = []
self.sum = 0
self.capacity = size
def next(self, val):
if self.window:
self.sum -= self.window.pop(0)
self.window.append(val)
self.sum += val
if len(self.window) > self.capacity:
self.sum -= self.window.pop(0)
return self.sum / len(self.window)
# 使用示例
obj = MovingAverage(3)
print(obj.next(1)) # 1.0
print(obj.next(3)) # 2.0
print(obj.next(-1)) # 1.0
print(obj.next(-3)) # -1.0 / 3.0 转换为浮点
JavaScript
class MovingAverage {
constructor(size) {
this.window = [];
this.sum = 0;
this.capacity = size;
}
next(val) {
if (this.window.length > 0) {
this.sum -= this.window.shift();
}
this.window.push(val);
this.sum += val;
if (this.window.length > this.capacity) {
this.sum -= this.window.shift();
}
return this.sum / this.window.length;
}
}
// 使用示例
const obj = new MovingAverage(3);
console.log(obj.next(1)); // 1
console.log(obj.next(3)); // 2
console.log(obj.next(-1)); // 1
console.log(obj.next(-3)); // -1 或更精确的小数形式
码小课网站中有更多相关内容分享给大家学习,涵盖了算法、数据结构、编程技巧等各个方面,欢迎大家访问学习。