采访中有人问我这个问题。
我被要求计算x1,x2,x3,... xn的平均值

class Iterator {
    bool hasNext;
    int getNext();
}

//因此归结为这样的事情:
double average (Iterator & it) {

double average = 0;
double sum = 0;
int len = 0;

while (it.hasNext == true) {

    sum += it.getNext();
}

if (len > 0)
    average = sum / len;
}

面试官说清单的大小是未知的,而且可能很大,所以总和可能溢出。他问我如何解决溢出问题,我一直跟踪我们可能超过最大数的次数等等,因此他回答了。他说了一些有关推入堆栈,平均值和长度的事情,我从不真正理解他通过推入这些得出的解决方案2个变量变成某种列表?有人知道吗?

最佳答案

我不知道使用堆栈,但是在代数的帮助下,我们可以使用旧的平均值来推导新平均值的公式。

假设您已经对n - 1项进行了平均,并且在oldAvg中具有了该平均值。

oldAvg =(x1 + x2 + .. + xn-1)/(n-1)

新的平均值将由newAvg表示:

newAvg =(x1 + x2 + .. + xn-1 + xn)/ n

通过一些代数运算,我们可以使用旧的平均值,平均的项目数和下一个项目来表示新的平均值。

newAvg =(x1 + x2 + .. + xn-1)/ n + xn / n

=((n-1)/(n-1))*(x1 + x2 + .. + xn-1)/ n + xn / n

= oldAvg / n *(n-1)+ xn / n

通过乘以n再除以n - 1可以避免溢出。然后,您所要做的就是添加下一项xn除以n

第一个循环将建立等于第一个元素的平均值,但是每个后续循环将使用上面的公式得出新的平均值。

n++;
newAvg = oldAvg / n * (n - 1) + it.next() / n;

10-06 03:03