求一个整数stream的sum, avg, median

好久没更新了, 上个新题吧。 求一个整数stream的sum, avg, median。 数据不断流入, 随时求sum, avg, median

 1) consume(int value)
 
 2 million
 
 2) getSum()
 3) getAverage()
 4) getMedian()
 
 
 1
 2
 -1
 0
 getSum => 1+2-1+0
 4 
 10
 20
 -90
 getAverage = 
 
 */


import java.io.*;
import java.util.*;


 
import java.math.BigInteger;
import java.math.BigDecimal;


class Solution 
{
  private BigInteger sum = new BigInteger("0");
  private double avg = 0;
  private long n = 0;
  
  private PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
    
  private PriorityQueue<Integer> minHeap = new PriorityQueue<>();
  
  public static void main(String[] args) 
  {
      Solution o = new Solution();
    
      int[] arr = new int[]{-3,-3,3,-3,-3,-3};
    
      //int[] arr1 = new int[]{-6,-4,3,3,3,3, 7, 10};

      for(int i=0; i<arr.length; i++) {
        o.consume(arr[i]);
        System.out.println("sum="+ o.getSum() );
        System.out.println("avg=" +  o.getAverage() );
        System.out.println("median=" +  o.getMedian() );
        System.out.println("-----");
      }
  }
  
  public void consume(int value) {
       sum = sum.add( new BigInteger(String.valueOf(value) ));
       n++;
       BigDecimal sumBigDeci = new BigDecimal(sum);
       //BigDecimal avgBigDeci =  sumBigDeci.divide(new BigDecimal(String.valueOf(n)));
       //avg = avgBigDeci.doubleValue(); 
   //     2  <min>             
   //                 3
   //  1   <max>
    
       if(maxHeap.isEmpty()) maxHeap.add(value); 
       else if(minHeap.isEmpty()) minHeap.add(value);
       else if(value >= minHeap.peek()) minHeap.add(value);
       else if(value <= maxHeap.peek()) maxHeap.add(value);
       
       if( minHeap.size() - maxHeap.size() > 1) {
           maxHeap.add( minHeap.remove());
       } else if( maxHeap.size() - minHeap.size() > 1) {
          minHeap.add( maxHeap.remove());
       }
  }
  
  public BigInteger getSum() {
      return sum;
  }
  
  public double getAverage() {
      System.out.println("n:" +  n );
      return avg;
  }
  
  public double getMedian() {
    
    System.out.println("minheap: " + minHeap.toString() );
                       
    System.out.println("maxheap: " + maxHeap.toString() );
    
    if(minHeap.isEmpty() && maxHeap.isEmpty()) return 0.0;
    
    if(minHeap.size() == maxHeap.size()) 
      return  (minHeap.peek() + maxHeap.peek() ) / 2.0;
    else if(minHeap.size() > maxHeap.size() ) 
      return minHeap.peek();
    else return maxHeap.peek();
  }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值