编写一个在其构造函数中采用步长 (n) 的类。该类中唯一的方法接受一个整数,将其添加到一个数字序列中,并返回插入该序列的最后 n 个值的平均值。不要遍历序列来计算平均值。
不,这不是家庭作业
以下是我在 C++ 中的做法:
- 初始化两个 STL
queue<int>
,其中一个有长度n
并且被称为buffer
- 用户 - 输入值动态存储在缓冲区中。填满后
buffer
,将用户输入值添加到“sum”并减去该buffer.front()
值。 - 将第一个值推
buffer
入第二个queue<int>
命名的值values
- 弹出第一个值 (
buffer.pop()
) sum
通过除以返回平均值n
以下是我想出的代码:
#ifndef calcAverage_Window_h
#define calcAverage_Window_h
#include <iostream>
#include <queue>
using namespace std;
class Window{
private:
int n, sum;
queue<int> values, buffer, sums;
public:
Window(int);
float calcAverage(int);
};
#endif
#include "Window.h"
Window::Window(int m){
n = m;
buffer.push(1);
buffer.push(2);
buffer.push(3);
sum = 6;
}
float Window::calcAverage(int val){
buffer.push(val);
values.push(buffer.front());
sum = sum + val - buffer.front();
buffer.pop();
return float(sum)/n; //float(sum) required so that calcAverage doesn't return an int
}
#include "Window.h"
int main()
{
Window w(3);
cout<<w.calcAverage(4)<<endl;
cout<<w.calcAverage(5)<<endl;
cout<<w.calcAverage(6)<<endl;
return 0;
}
我有以下问题:
- 有一个更好的方法吗?
- 如果我们也不允许使用 STL,我会实现一个队列并将其用于
buffer
andvalues
。有没有人有更好的主意? Window(n)
我通过在构造函数中初始化缓冲区来作弊。那是因为:1)我不知道我还能怎么做 2)对于什么时候的情况可能很清楚n = 2
,但对于n = 3
.- 这个方法/代码会在哪里失败?
- 我凭经验想到了这种方法。有没有一种算法方法来看待这个问题?