(队列的实现与应用)——给定一个整数流和一个窗口的大小,根据滑动窗口的大小,计算其所有整数的移动平均值。

给定一个整数流和一个窗口的大小,根据滑动窗口的大小,计算其所有整数的移动平均值。

例如:

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;

分析测试用例

  1. 窗口的大小固定
  2. 调用next添加数字并计算平均值
  3. 超过窗口的大小,最先添加的数字需要先移除(队列的特点:先进先出)

解题思路

  1. 使用队列来添加数字
  2. 通过添加成员变量来保存计算的值

算法流程

  1. 新增数值,正常入队
  2. 累加整数并保存结果
  3. 如果队列的长度超过窗口的长度,则减去最先进入队列的元素,然后让最先进入队列的元素出队
  4. 返回平均值

示例代码

    <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>

总结:这道题其实就是利用了队列先进先出的特点,一般的计算平均值,但是一旦超过窗口的大小,就需要把最先进入队列的元素出队,然后再减去最先进队的元素求和&求平均值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值