webank---9.3---笔试第三题
题目描述: 输入三个整数,n,u,v,n是接下来输入数组的长度,u和v等下再用 再输入一个数组nums 然后求nums的连续子数组有多少个,这个子数组的均值等于u/v
思路:前缀和+hash表
技巧:由于平均数比较麻烦,先将所有元素都乘v然后再减去u,这样方便后面的前缀和(即,原来是avg(子数组)=u/v,我们更改以后是:子数组的和等不等于0),算式是这样的:(x1+x2+……xn) / n= u/v --->(转化成)(x1+x2+……xn)*v -n*u = 0 --->(再化简) (x1*v-u) + (x2*v-u) + (x3*v-u) + …… + (xn*v-u) = 0,将这个数组全新定义为新的nums。接下来的问题就是【LC:和为k的子数组个数】
代码:
while(1): line1 = input().strip() if len(line1)<=0:break line1 = line1.split(' ') n,u,v = int(line1[0]),int(line1[1]),int(line1[2]) line2 = input().strip() nums = [int(x) for x in line2.split(' ')] def f(nums,u,v): nums = [x*v-u for x in nums] res = 0 presum = [0] for x in nums:presum.append(presum[-1]+x) presum = presum[1:] hashset = dict() for x in presum: # print(x,hashset,res) if x==0:res+=1 if x in hashset: res+=hashset[x] hashset[x]+=1 else:hashset[x] = 1 return res print(f(nums,u,v))#笔试##webank##好难啊##心态崩了##晒一晒我的offer#