两道面试题解答之二 Moving Average, Moving Median(二)

2014-11-24 08:14:29 · 作者: · 浏览: 4
00
7.000
7.000
12.000
7.000
7.000

Should yield the output:

10.000
12.000

Since 10 and 12 each vary by more than 50% from the median of the previous 3 values.

package bridgewater;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class MovingMedianSolution {

	private List
  
    inputs = new ArrayList
   
    (); private int winSize = 0; private double maxChange = 0; public MovingMedianSolution(){ } public static void main(String[] args) throws Exception { BufferedReader br = null; MovingMedianSolution solution = new MovingMedianSolution(); try { InputStream inputStream = new FileInputStream(input2.txt); Reader reader = new InputStreamReader(inputStream); br = new BufferedReader(reader); // br = new BufferedReader(new InputStreamReader(System.in)); solution.winSize = Integer.parseInt(br.readLine()); solution.maxChange = Double.parseDouble(br.readLine()); String input = br.readLine(); while(input != null){ solution.inputs.add(input); solution.process(solution.inputs); input = br.readLine(); } } finally { if (br != null) br.close(); } } public void process(List
    
      inputs) { if(winSize<=0 || maxChange<0 || inputs.size() < winSize+1){ return; } ArrayList
     
       al = new ArrayList
      
       (); for(int i=inputs.size()-2; i>=inputs.size()-1-winSize; i--){ al.add(Double.parseDouble(inputs.get(i))); } Collections.sort(al); double median = al.get(al.size()/2); // even size if((al.size() & 1) == 0){ // When it is odd size median = al.get(al.size()/2-1); } double cur = Double.parseDouble(inputs.get(inputs.size()-1)); if(Math.abs(cur-median)*1.0/median > maxChange){ System.out.println(String.format(%.3f, cur)); } } }