这道题,我看了半天没看懂,等看懂的时候,时间都快结束了。
1 class Solution: 2 def sampleStats(self, count: 'List[int]') -> 'List[float]': 3 l = [] 4 sums = 0 5 n = 0 6 maxv = -1 7 minv = 256 8 modev = -1 9 modetime = 0 10 for i in range(len(count)): 11 c = count[i] 12 if c != 0: 13 l.append((i,c)) 14 sums += c * i 15 n += c 16 maxv = max(maxv,i) 17 minv = min(minv,i) 18 if modetime < c: 19 modetime = c 20 modev = i 21 meanv = sums / n 22 medianv = 0 23 half = 0 24 if n % 2 == 1: 25 for i in range(len(l)): 26 half += l[i][1] 27 if half >= n // 2: 28 medianv = l[i][0] 29 break 30 else: 31 for i in range(len(l)): 32 half += l[i][1] 33 if half == n // 2: 34 medianv = (l[i][0] + l[i+1][0]) / 2 35 break 36 elif half > n // 2: 37 medianv = l[i][0] 38 break 39 return [float(minv),float(maxv),float(meanv),float(medianv),float(modev)]
简单介绍一下思路,本题是要求一个数组的:最小数,最大数,平均数,中位数,众数。
但是给出的不是原始数组,而是数组的统计。
例如:[0,1,5,0,2,3],表示的是[1,2,2,2,2,2,4,4,5,5,5]。就是说从0~255,下标i表示数值,对应元素表示这个数值有多少个。
如果要把整个数组还原,再进行统计,就会TLE。因此要考虑不还原数组,而是遍历统计数组的同时记录一些信息。
最小值和最大值分别对应第一个出现的非0数的下标,和最后一个出现的非0数的下标。
平均值,就是用元素的和除以原始数组的个数。众数就是统计数组中的最大值对应的下标。
比较麻烦的是中位数,这个数字对于偶数个元素是中间的两个元素的平均值,对于奇数个元素是中间的元素的值。
所以需要根据总元素的个数是奇数还是偶数分类处理。具体的处理逻辑见22~38行。
最后返回的是float类型,python的数组中可以包含不同类型的数据,因此不会自动将int广播成float,需要手动转换。
总之这道题,差评吧。