
给定一个整数数据流和一个窗口大小根据该滑动窗口的大小计算滑动窗口里所有数字的平均值。实现MovingAverage类MovingAverage(int size)用窗口大小size初始化对象。double next(int val)成员函数next每次调用的时候都会往滑动窗口增加一个整数请计算并返回数据流中最后size个值的移动平均值即滑动窗口里所有数字的平均值。示例输入inputs [MovingAverage, next, next, next, next] inputs [[3], [1], [10], [3], [5]]输出[null, 1.0, 5.5, 4.66667, 6.0]解释MovingAverage movingAverage new MovingAverage(3); movingAverage.next(1); // 返回 1.0 1 / 1 movingAverage.next(10); // 返回 5.5 (1 10) / 2 movingAverage.next(3); // 返回 4.66667 (1 10 3) / 3 movingAverage.next(5); // 返回 6.0 (10 3 5) / 3提示1 size 1000-105 val 105最多调用next方法104次答案测试结果void testLeeCodeLCR041(void) { // LeeCode LCR041 数据流中的平均移动值 class MovingAverage { public: /** Initialize your data structure here. */ MovingAverage(int size) : size(size), idx(0), count(0), sum(0){ window (int *)malloc(size * sizeof(int)); if (window nullptr) { throw std::bad_alloc(); } } double next(int val) { if (count size) { sum - window[idx]; } else { count; } window[idx] val; sum val; idx (idx 1) % size; return static_castdouble(sum) / count; } ~MovingAverage() { free(window); window nullptr; // 防止悬空指针 } private: int *window; // 保存滑动窗口数据 int size; // 滑动窗口大小 int count; // 滑动窗口中实际有多少个数 int idx; // 调用next函数获取到数字时保持到数组这个索引处 long long sum; }; /** * Your MovingAverage object will be instantiated and called as such: * MovingAverage* obj new MovingAverage(size); * double param_1 obj-next(val); */ // 测试代码 int size 3; MovingAverage* obj new MovingAverage(size); double param_1 obj-next(1); double param_2 obj-next(10); double param_3 obj-next(3); double param_4 obj-next(5); std::cout param_1 std::endl param_2 std::endl param_3 std::endl param_4 std::endl; }运行ok. 提交到LeeCodeok. 消耗内存很小。 之前想用链表实现的但不如直接用数组好。