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#
全部评论
给个简介的公式,用前缀和prefix数组。对于子数组[i, j],如果满足均值条件,则有(prefix[j] - prefix[i - 1]) = u / v * (j - i + 1)。这个公式化简以下就有prefix[j] * v - u * j = prefix[i - 1] * v - u * (i - 1)。可以看到左右两边形式都是一样的,只和j和(i- 1)有关,所以可以线性解法,遍历每个位置用哈希表记录prefix[x] * v - u * x,然后对比前面记录的相同的个数。除此之外,还有个边界条件,是i=0的情况,只要判断prefix[j] * v - u * j是否等于0,是则result+1
1 回复 分享
发布于 2023-09-03 22:30 上海
调整心态,继续前进
1 回复 分享
发布于 2023-09-03 21:58 广东
顺带:其实我当时也没想出来,还是各方面都差了些,调整心态,继续前进
点赞 回复 分享
发布于 2023-09-03 21:43 湖南
哈希表的操作是:每当遇到一个前缀和数组中的元素x,如果它本来就是0,那就res+=1,然后再看哈希表里面是不是已经有x了,有几个,就res加上几。
点赞 回复 分享
发布于 2023-09-03 21:43 湖南

相关推荐

bg27强双非本,目前在学习golang后端gin框架部分,在b站找了一个轮子项目敲了一下,技术栈是gin&nbsp;+&nbsp;gorm&nbsp;+&nbsp;mysql&nbsp;+&nbsp;redis。我目前的想法是这一个月学习408和go八股以及刷算法然后在12月找个寒假实习然后大三下开始准备考研。我是考研意愿比较强烈,想问一下我是应该all&nbsp;in其中一个方向吗,我感觉我实习对我考研来说也是没什么帮助的好像。
牛客28967172...:毕业工作,考研,考公是完全不同的方向。 99%的人拼尽全力也只能把一个做好(能做好都已经是佼佼者了,比如进进大厂,考985或者考公) 如果你确定要考研可以不用学任何就业技术框架,也不用实习经验,刷题背知识点就行,但注意必须考92院校起步,因为这个年代双非硕毕业后完全不如双非本(互联网行业),可以说双非硕在互联网就业完全是负收益
投递哔哩哔哩等公司10个岗位
点赞 评论 收藏
分享
09-28 22:01
已编辑
广西科技大学 IT技术支持
合适才能收到offe...:找桌面运维?
点赞 评论 收藏
分享
评论
2
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务