【问题标题】:Overflow of integer in JavaJava中的整数溢出
【发布时间】:2014-06-08 20:09:21
【问题描述】:

我在一次采访中被问到这个问题。 我被要求计算数字 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;
}

面试官说列表大小未知,可能很大,所以 sum 会溢出。他问我如何解决溢出问题,我通过跟踪我们超过最大数量的次数等来回答,他说了一些关于推入堆栈、平均值和长度的问题,我从来没有真正理解他通过推这些的解决方案2个变量进入某种列表?有人有线索吗?

【问题讨论】:

标签: java overflow average


【解决方案1】:

他可能指的是您不需要所有项来计算平均值,而是可以跟踪moving average。这可以与迄今为止考虑得出的术语总和的术语数一起使用。

由于总数可能太大而无法存储很长时间,因此您需要使用 BigInteger 之类的东西来保存总数。

【讨论】:

  • 你能详细说明一下吗,因为他确实提到了 BigDecimal,然后继续为他的下一个问题移动平均。
【解决方案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 - 1 之前除以n 来避免溢出。然后你所要做的就是添加下一项,xn,除以n

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

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

【讨论】:

    【解决方案3】:

    如果你进一步简化 rgettman 的公式,你会得到:

    len++;
    average = average + (it.next() - average) / len;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-21
      • 2022-01-07
      • 2014-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多