这道题,我看了半天没看懂,等看懂的时候,时间都快结束了。

 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,需要手动转换。

总之这道题,差评吧。

posted on 2019-06-23 11:52  Sempron2800+  阅读(158)  评论(0编辑  收藏  举报