移动平均数最简洁的算法

来源:互联网 发布:淘宝达人赚钱 编辑:程序博客网 时间:2024/05/21 11:10

不断地从command line读取数字,要求算最新出现的N个数字的平均数。


这个平均数的值是流动的,例如

 *  % java RunningAverage 4 *  2.0 4.0 6.0 2.0 2.0 2.0 2.0 3.0  *  <ctrl-d>  *  3.5 3.5 3.0 2.0 2.25

每次打印最新4个数字的平均数。


最简洁的算法:

import java.util.Scanner;public class RunningAverage {public static void main(String[] args) {    Scanner sc = new Scanner(System.in);int N = Integer.parseInt(args[0]);double[] ave = new double[N];double sum = 0.0;for(int i = 1; sc.hasNext(); i++) {sum -= ave[i % N];ave[i % N] = sc.nextDouble();sum += ave[i % N];if(i >= N) System.out.print(sum/N + " ");}}}

几个关键点:

1)设置一个数组来放需要计算平均数的N个数字;这个数组内容是在不断变化的

2)数组最初每个位置都是0,然后把读到的数字一个一个往里面填,填满N个之后,再读新数字时,就需要把最先填进去的那个数挖掉,换成新的数

3)变量sum追踪N个数之和,sum也是流动的,从数组里挖掉旧数字时,也要把它从sum里挖掉

4)什么时候开始计算平均数- 第一次是在当数组填满N个时,就可以求平均数了;以后每读到一个新数字,就“流动”计算一次

5)利用了i 和 N的关系,取模是一种很有用的方式

6)for loop里的条件sc.hasNext()

0 0
原创粉丝点击