移动平均数最简洁的算法

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


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

 *  % java RunningAverage 4
 *  2.0 4.0 6.0 2.0 2.0 2.0 2.0 3.0 
 *   
 *  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()

你可能感兴趣的:(Java,Review)