当前位置: 面试刷题>> 数据流滑动窗口平均值 (经典算法题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

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 或更精确的小数形式

码小课网站中有更多相关内容分享给大家学习,涵盖了算法、数据结构、编程技巧等各个方面,欢迎大家访问学习。

推荐面试题