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进一个数组里,然后再计算中位数,但是提交时报错,大概问题就是样本取值太多,样本数组太长,栈溢出了,然后这里换了种思路,将数据放在数组对象里,循环累加取样次数和样本个数的中间值比较,这里如果取样个数是奇数,累加的取样数值第一次大于或等于中间值时,中位数即为该元素,跳出循环即可。如果取样个数是偶数,这里需要取两个元素的平均值。