9.5 搜狗研究方向笔试3ac笔经

写在最开始,最近笔试面试一直被虐,终于有个全ac的- -开心,



第一题,汪仔换道具,主要思路就是先减去直接换的,然后排序,此时a=0,分为两种情况,b,c给a,以及c给b和a。设x解方程就可以求出表达式

class Solution:
    def numberofprize(self , a , b , c ):
        # write code here
        res = 0
        res+= min(a,b,c)
        a -= res
        b -= res
        c -= res
        a,b,c = sorted([a,b,c])
        
        return min(res + (2*b+c)//5,res + (b+c)//4)

第二题,建房子,思路是找房子间隔,大于t就+2,等于t就+1,最后考虑最左和最右,+2就可以了

class Solution:
    def getHouses(self , t , xa ):
        # write code here
        res = 0
        for i in range(0,len(xa),2):
            xa[i],xa[i+1] = xa[i]-xa[i+1]/2,xa[i]+xa[i+1]/2
        for i in range(len(xa)//2 -1):
            if xa[2*i+2] - xa[2*i+1] == t:
                res += 1
            elif xa[2*i+2] - xa[2*i+1] > t:
                res += 2
        return res+2

第三题 求方差和最小的idx,这个题是原题= =有舍友阿里被问过。方法就是D(x) = E(X^2) - E(X)^2,利用前缀和数组,可以很快计算出arr[i:j]的E(X)^2和E(X^2).

class Solution:
    def find_best_cut(self , arr ):
        # write code here
        n = len(arr)
        prex = [0]
        prex2 = [0]
        for num in arr:
            prex.append(prex[-1]+num)
            prex2.append(prex2[-1]+num**2)
        def var(i,j):
            if i>=j:return 0
            n = j-i+1
            Ex = (prex[j+1]-prex[i])/n
            Ex2 = (prex2[j+1]-prex2[i])/n
            return Ex2-Ex**2
        v = float('inf')
        res = 0
        for i in range(0,n):
            temp = abs(var(0,i-1) + var(i,n-1))
            if temp < v:
                res = i
                v = temp
        return res



#笔试题目##搜狗#
全部评论
大佬
点赞 回复 分享
发布于 2020-09-05 20:36
第一题那个2*b+c//5是啥意思啊
点赞 回复 分享
发布于 2020-09-05 20:37
没想到我一元方程算错了。。。
点赞 回复 分享
发布于 2020-09-05 20:53
第一题最后 return 为什么是 min 而不是 max 呢?
点赞 回复 分享
发布于 2020-09-05 21:00
第一题未知数x是什么啊
点赞 回复 分享
发布于 2020-09-05 21:01
假设a,b,c是已经去除最小值后排序的数组即a=0<=b<=c,设此时最多可以换取x个道具: 第一种情况:用b,c换取a                     b+c-2x>=2x         --------------(1)                     解释:把b,c看成整体,由于a为0,即需要从b和c中一共抽取2x个才能换取x个a,并且最后b和c至少剩余2x个(即b至少剩下x个,c至少剩下x个) 第二种情况:用a换取b、c                     c-2(x-b)-2x>=x 并且 x>=b   -----(2)                    解释:c换取x个a需要花费2x个c,由于b不为0,因此c只需要换取(x-b)个b即可,最后c至少剩下x个 联立(1)(2)解得: x<=(b+c)/4 b<=x<=(2b+c)/5 即最后的结果为取上面两个解的最小值中的最大值
点赞 回复 分享
发布于 2020-09-09 09:44

相关推荐

2 8 评论
分享
牛客网
牛客企业服务