美团春季实习笔试

第一题思路:

矩阵位置为(i,j)
题目的意思是(i+j)%2==0上为同一个数字,(i+j)%2==1上为同一个数字
那么就建立两个字典d1,d2,存放key=matrix[i][j],values=matrix[i][j]出现的次数, 然后分别按values降序。
最后进行判断
1.d1的数字与d2的数字相等
n*m-max(a1[i][0],b1[0][0])
2.d1的数字与d2的数字相等:
n*m-a1[0][0]-b1[j][0]
附上AC代码
if __name__=='__main__':
    n,m=map(int,input().split())
    d1={}
    d2={}
    for i in range(n):
        tmp=list(map(int,input().split()))
        for j in range(m):
            if (i+j)%2==0:
                if tmp[j] in d1:
                    d1[tmp[j]]+=1
                else: d1[tmp[j]]=1
            else:
                if tmp[j] in d2:
                    d2[tmp[j]]+=1
                else: d2[tmp[j]]=1
    a1=[]
    b1=[]
    for k1 in d1.keys():
        a1.append([d1[k1],k1])
    for k2 in d2.keys():
        b1.append([d2[k2],k2])
    a1=sorted(a1,key=lambda x:x[0],reverse=True)
    b1=sorted(b1,key=lambda x:x[0],reverse=True)
    res=float('inf')
    i=j=0
    while i<len(a1):
        if a1[i][1]!=b1[0][1]:
            tmp=n*m-a1[i][0]-b1[0][0]
            res=min(tmp,res)
            break
        else:
            tmp=n*m-max(a1[i][0],b1[0][0])
            res=min(tmp,res)
            i+=1
    while j<len(b1):
        if a1[0][1]!=b1[j][1]:
            tmp=n*m-a1[0][0]-b1[j][0]
            res=min(tmp,res)
            break
        else:
            tmp=n*m-max(a1[0][0],b1[j][0])
            res=min(tmp,res)
            j+=1
    print(res)

第二题思路:

来不及写了😅
树形DP?
#实习##春招##笔试题目#
全部评论
思路差不多一样但后面降序的地方走歪路了,,一直在想优化到考虑出现次数第一第二多的情况然后两边检查一下,,
点赞 回复 分享
发布于 2019-04-23 21:45
感谢优秀的老哥😂
点赞 回复 分享
发布于 2019-04-23 21:43
优秀
点赞 回复 分享
发布于 2019-04-23 21:41

相关推荐

评论
点赞
14
分享

创作者周榜

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