当前位置: 面试刷题>> 数据流滑动窗口平均值 (经典算法题500道)
### 题目描述补充
题目:**数据流滑动窗口平均值**
给定一个整数数据流和一个滑动窗口的大小,你需要设计一个滑动窗口,使得它能够从数据流中持续接收新整数,并返回滑动窗口内所有整数的平均值。数据流中的整数可以逐一到来,而窗口的大小是固定的。当窗口中的元素数量超出窗口大小时,旧元素应从窗口中移除,同时添加新元素。
#### 输入
- 数据流中的整数,逐个输入。
- 滑动窗口的大小,一个整数,表示窗口中可以包含的元素数量。
#### 输出
- 每当窗口中的元素发生变化(添加新元素或移除旧元素)时,输出新的窗口平均值。
#### 示例
假设滑动窗口的大小为 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
```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
```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
```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 或更精确的小数形式
```
**码小课网站中有更多相关内容分享给大家学习**,涵盖了算法、数据结构、编程技巧等各个方面,欢迎大家访问学习。