当前位置: 面试刷题>> 数据流滑动窗口平均值 (经典算法题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 或更精确的小数形式 ``` **码小课网站中有更多相关内容分享给大家学习**,涵盖了算法、数据结构、编程技巧等各个方面,欢迎大家访问学习。
推荐面试题