9.1 拼多多 笔试 算法岗位 3.35/4

总体是 1.0-0.75-0.6-1.0

1. 12345678找规律,不算难,根据矩阵中i,j的坐标判断matrix[i][j] 的值.  ac 1.0
n = int(input())
matrix = [[0]*n for i in range(n)]
if n%2 == 1:
    for i in range(n):
        for j in range(n):
            if i == n//2&nbs***bsp;j == n//2&nbs***bsp;i==j&nbs***bsp;i+j == n-1:
                continue
            if 0<=i<=n//2-1:
                if 0<=j<=i-1:
                    matrix[i][j] = 3
                elif i<=j<=n//2-1:
                    matrix[i][j] = 2
                elif n//2+1<=j<n-1-i:
                    matrix[i][j] = 1
                else:
                    matrix[i][j] = 8
            if n//2 <= i <= n-1:
                if 0<=j<=n-i-1:
                    matrix[i][j] = 4
                elif n-i-1<j<=n//2:
                    matrix[i][j] = 5
                elif n//2<=j<=i-1:
                    matrix[i][j] = 6
                else:
                    matrix[i][j] = 7

    for i in range(n):
        print(' '.join(list(map(str,matrix[i]))))

if n%2== 0:
    for i in range(n):
        for j in range(n):
            if i==j&nbs***bsp;i+j == n-1:
                continue
            if 0<=i<=n//2-1:
                if 0<=j<=i-1:
                    matrix[i][j] = 3
                elif i<=j<=n//2-1:
                    matrix[i][j] = 2
                elif n//2<=j<=n-1-i:
                    matrix[i][j] = 1
                else:
                    matrix[i][j] = 8
            if n//2 <= i <= n-1:
                if 0<=j<=n-i-1:
                    matrix[i][j] = 4
                elif n-i-1<j<n//2:
                    matrix[i][j] = 5
                elif n//2<=j<=i-1:
                    matrix[i][j] = 6
                else:
                    matrix[i][j] = 7
    for i in range(n):
        print(' '.join(list(map(str,matrix[i]))))
2. 先把1所在的每一块区域回溯计算得到面积,再判断每个0的4个方向1的面积,比对即可 ; 0.75
n,m = list(map(int, input().split()))
matrix = []
for i in range(n):
    matrix.append(list(map(int, input().split())))

res = []
all = sum([sum(x) for x in matrix])
def helper(i,j):
    if not (0<=i<=n-1 and 0<=j<=m-1):
        return
    if matrix[i][j] == 0:
        return
    if matrix[i][j] == 2:
        return
    res.append(1)
    matrix[i][j] = 2
    helper(i+1, j)
    helper(i-1, j)
    helper(i, j+1)
    helper(i, j-1)


def change(i,j,num,index):
    if not (0<=i<=n-1 and 0<=j<=m-1):
        return
    if matrix[i][j] == 0:
        return
    if type(matrix[i][j]) is not int:
        return

    matrix[i][j] = [num,index]
    change(i+1, j, num, index)
    change(i-1, j, num, index)
    change(i, j+1, num, index)
    change(i, j-1, num, index)

index = 1
for i in range(n):
    for j in range(m):
        res = []
        helper(i,j)
        num = sum(res)
        change(i,j,num,index)
        index += 1

def concat(i,j):
    tem = 0
    around = set()
    if 0<=i+1<=n-1:
        if matrix[i+1][j]!=0:
            if matrix[i+1][j][1] not in around:
                tem += matrix[i+1][j][0]
                around.add(matrix[i+1][j][1])
    if 0<=i-1<=n-1:
        if matrix[i-1][j]!=0:
            if matrix[i-1][j][1] not in around:
                tem += matrix[i-1][j][0]
                around.add(matrix[i-1][j][1])
    
    if 0<=j+1<=m-1:
        if matrix[i][j+1]!=0:
            if matrix[i][j+1][1] not in around:
                tem += matrix[i][j+1][0]
                around.add(matrix[i][j+1][1])
    
    if 0<=j-1<=m-1:
        if matrix[i][j-1]!=0:
            if matrix[i][j-1][1] not in around:
                tem += matrix[i][j-1][0]
                around.add(matrix[i][j-1][1])
    return tem
# for i in range(n):
#     print(matrix[i])
res = 0
around = set()

for i in range(n):
    for j in range(m):
        if matrix[i][j] == 0:
            tem = concat(i,j)
            # print(tem)
            if tem<all:
                res = max(tem+1,res)
            else:
                res = max(tem,res)
print(res)
3. 带负数的上限背包,没考虑负数,只考虑正数; 0.6
n,m = list(map(int, input().split()))
C = []
V = []
tem = 0
for i in range(n):
    ci, vi = list(map(int, input().split()))
    if ci == 0:
        tem+=vi
        continue
    C.append(ci)
    V.append(vi)



dp = [[tem]+[0]*(m) for _ in range(len(C)+1)]
for i in range(1,len(C)+1):
    for j in range(1,m+1):
        dp[i][j] = dp[i-1][j]
        if C[i-1]<=j:
            dp[i][j] = max(dp[i][j], dp[i-1][j-C[i-1]]+V[i-1])
print(dp[-1][-1])

4. 首先要除去m中的大公约数防止重复计算,然后回溯得到feature中所有的排列组合,再用n一个一个除即可,这里注意,如果是计数个组合,则相加,偶数个,则相减。 ac 1.0
n,m = list(map(int, input().split()))
feature = []
for i in range(m):
    feature.append(int(input()))
feature.sort()
i = 0
while i<=len(feature)-1:
    for j in range(i):
        if feature[i]%feature[j] == 0:
            feature.pop(i)
            i-=1
            break
    i+=1

res = 0
index = []
length = len(feature)
def get(start,tem):
    index.append(tem+[])
    for i in range(start,length):
        get(i+1,tem+[feature[i]])
get(0,[])
index.pop(0)
# print(index)
def product(nums):
    tem = 1
    for num in nums:
        tem*=num
    return tem

for ind in index:
    g = len(ind)
    tem = product(ind)
    k = n//tem
    print(ind,k)

    if g % 2 == 1:
        res+=k
    else:
        res-=k
print(res)

面试求捞。。。


#笔试题目##拼多多#
全部评论
拼多多算法岗有通知面试的吗?
点赞 回复 分享
发布于 2020-09-03 12:18
大佬,第四题我考虑到求全体排列组合了,但是没有想到最大公约数的问题 #
点赞 回复 分享
发布于 2020-09-01 21:12

相关推荐

06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
评论
2
14
分享

创作者周榜

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