G面经prepare: Data Stream Average

本文介绍了一个用于处理数据流并计算固定窗口大小内数值平均值的类实现,包括如何使用队列和数组进行操作,同时讨论了避免使用向量的方法。
给一个datastream和一个fixed window size, 让我design一个class可以完成add number还有find average in the window. 就是不能用vector得用array. 

当然用queue是最好的

package DataStreamAverage;

import java.util.*;

public class Solution {
    int count;
    int sum;
    Queue<Integer> q;
    
    public Solution() {
        this.count = 0;
        this.sum = 0;
        this.q = new LinkedList<Integer>();
    }
    
    
    public ArrayList<Double> average (HashSet<Integer> set, int L) {
        ArrayList<Double> result = new ArrayList<Double>();
        Iterator<Integer> iter = set.iterator();
        while (iter.hasNext()) {
            int cur = iter.next();
            q.offer(cur);
            count++;
            sum += cur;
            if (q.size()>L) {
                int front = q.peek();
                sum -= front;
                count--;
                q.poll();
            }
            double aver = (double)sum/count;
            result.add(aver);
        }
        return result;
        
    }
    

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        HashSet<Integer> set = new HashSet<Integer>();
        for (int i=1; i<=10; i++) {
            set.add(i);
        }
        Solution sol = new Solution();
        ArrayList<Double> res = sol.average(set, 2);
        System.out.println(res);
    }

}

当然用fixed size array也可以,但是要小心,一个是要折回,二个是要删除数组元素之前存在的数

 1 package DataStreamAverage;
 2 
 3 import java.util.*;
 4 
 5 public class Solution2 {
 6     int count;
 7     int sum;
 8     int[] arr;
 9     int pos;
10     
11     public Solution2(int size) {
12         this.count = 0;
13         this.sum = 0;
14         this.arr = new int[size];
15         Arrays.fill(arr, Integer.MIN_VALUE);
16         this.pos = 0;
17     }
18     
19     
20     public ArrayList<Double> average (HashSet<Integer> set, int L) {
21         ArrayList<Double> result = new ArrayList<Double>();
22         Iterator<Integer> iter = set.iterator();
23         while (iter.hasNext()) {
24             int cur = iter.next();
25             if (pos == arr.length) {
26                 pos = 0;
27             }
28             if (arr[pos] != Integer.MIN_VALUE) {
29                 sum -= arr[pos];
30                 count--;
31             }
32             arr[pos] = cur;
33             sum += arr[pos];
34             pos++;
35             count++;
36             double aver = (double)sum/count;
37             result.add(aver);
38         }
39         return result;
40     }
41     
42 
43     /**
44      * @param args
45      */
46     public static void main(String[] args) {
47         // TODO Auto-generated method stub
48         HashSet<Integer> set = new HashSet<Integer>();
49         for (int i=1; i<=10; i++) {
50             set.add(i);
51         }
52         Solution2 sol = new Solution2(2);
53         ArrayList<Double> res = sol.average(set, 2);
54         System.out.println(res);
55     }
56 
57 }

 

转载于:https://www.cnblogs.com/EdwardLiu/p/5143909.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值