1093. 大样本统计

1093. 大样本统计

难度中等

36

我们对 0 到 255 之间的整数进行采样,并将结果存储在数组 count 中:count[k] 就是整数 k 在样本中出现的次数。

计算以下统计数据:

  • minimum :样本中的最小元素。

  • maximum :样品中的最大元素。

  • mean :样本的平均值,计算为所有元素的总和除以元素总数。

  • median :

    • 如果样本的元素个数是奇数,那么一旦样本排序后,中位数 median 就是中间的元素。
    • 如果样本中有偶数个元素,那么中位数median 就是样本排序后中间两个元素的平均值。
  • mode :样本中出现次数最多的数字。保众数是 唯一 的。

以浮点数数组的形式返回样本的统计信息 **[minimum, maximum, mean, median, mode] 。与真实答案误差在 **10-5 **内的答案都可以通过。

示例 1:

输入: count = [0,1,3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
输出: [1.00000,3.00000,2.37500,2.50000,3.00000]
解释: 用count表示的样本为[1,2,2,2,3,3,3,3]。
最小值和最大值分别为1和3。
均值是(1+2+2+2+3+3+3+3) / 8 = 19 / 8 = 2.375。
因为样本的大小是偶数,所以中位数是中间两个元素2和3的平均值,也就是2.5。
众数为3,因为它在样本中出现的次数最多。

示例 2:

输入: count = [0,4,3,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
输出: [1.00000,4.00000,2.18182,2.00000,1.00000]
解释: 用count表示的样本为[1,1,1,1,2,2,3,3,3,4,4]。
最小值为1,最大值为4。
平均数是(1+1+1+1+2+2+2+3+3+4+4)/ 11 = 24 / 11 = 2.18181818…(为了显示,输出显示了整数2.18182)。
因为样本的大小是奇数,所以中值是中间元素2。
众数为1,因为它在样本中出现的次数最多。
/**
 * @param {number[]} count
 * @return {number[]}
 */
var sampleStats = function(count) {
    let minimum = null,maximum = null,samplesSum=0,n=0,maxTimes=0,mode=0,median =0
    
    let samples = []
    count.forEach((item,index)=>{
        if(item>0){
           if(minimum === null){minimum = index}
           maximum = index
           samplesSum+=item*index
           n+=item
           if(item>maxTimes){
               maxTimes = item
               mode = index
           }
           samples.push({key:index,count:item})
        }
    })
    let mean = samplesSum/n
    if(n%2===0){
        let sum=0
        let n1=n/2,n2=n/2+1,median1=-1,median2=-1
        for(let m=0;m<samples.length;m++){
            sum += samples[m].count
            if(sum>=n1&&median1<0){
                median1 = samples[m].key
            }
            if(sum>=n2&&median2<0){
                median2 = samples[m].key
            }
            if(median1>0&&median2>0){
                median  = (median1+median2)/2
                break
            }
        }
    }else{
        let sum=0
         for(let m=0;m<samples.length;m++){
            sum += samples[m].count
            if(sum>=(n+1)/2){
                median = samples[m].key
                break
            }
        }
    }
    return [minimum, maximum, mean, median , mode]
};

样本中的最小元素、最大元素、平均值和众数都没啥可讲的,中位数这里会有些麻烦,原来想的是将所有样本push进一个数组里,然后再计算中位数,但是提交时报错,大概问题就是样本取值太多,样本数组太长,栈溢出了,然后这里换了种思路,将数据放在数组对象里,循环累加取样次数和样本个数的中间值比较,这里如果取样个数是奇数,累加的取样数值第一次大于或等于中间值时,中位数即为该元素,跳出循环即可。如果取样个数是偶数,这里需要取两个元素的平均值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值