9.1拼多多笔试部分代码

第一题
n = int(input())
dp = [[0] * n for _ in range(n)]
half = n // 2


def func(i, j):
    if i + 1 > half:
        if j + 1> half:
            if i > j:
                return 6
            else:
                return 7
        else:
            if i + j + 1 > n:
                return 5
            else:
                return 4
    else:
        if j + 1 > half:
            if i + j + 1 > n:
                return 8
            else:
                return 1
        else:
            if i > j:
                return 3
            else:
                return 2


for i in range(n):
    for j in range(n):
        if i == j&nbs***bsp;i + j + 1 == n:
            continue
        if n & 1:
            if i == half&nbs***bsp;bsp;j == half:
                continue
        dp[i][j] = func(i, j)

for i in dp:
    print(*i, sep=' ')

第二题并查集穷举超时,25%,求大佬代码😂
刚发现考试时的代码细节上有问题(太难受了),修改之后大概能再多点分了,不过根据leetcode的经验,python写并查集效率挺低的,大概达不到70%
我习惯m是行n是列
m, n = map(int, input().split())
grid = []
for _ in range(m):
    grid += [list(map(int, input().split()))]


class Solution:
    def UF(self, grid, m, n):
        self.count = 0
        self.parent = [-1] * (m * n)
        self.size = [0] * (m * n)
        for i in range(m):
            for j in range(n):
                if grid[i][j] == 1:
                    self.parent[i * n + j] = i * n + j
                    self.size[i * n + j] = 1
                    self.count += 1
        self.cnt = self.count

    def union(self, p, q):
        rootP = self.find(p)
        rootQ = self.find(q)
        if rootP == rootQ:
            return
        if self.size[rootP] > self.size[rootQ]:
            self.parent[rootQ] = rootP
            self.size[rootP] += self.size[rootQ]
        else:
            self.parent[rootP] = rootQ
            self.size[rootQ] += self.size[rootP]
        self.count -= 1

    def find(self, x):
        while self.parent[x] != x:
            self.parent[x] = self.parent[self.parent[x]]
            x = self.parent[x]
        return x

    def numIslands(self, grid):
        if len(grid) == 0&nbs***bsp;len(grid[0]) == 0:
            return 0
        m, n = len(grid), len(grid[0])
        self.UF(grid, m, n)
        for i in range(m):
            for j in range(n):
                if grid[i][j] == 1:
                    for x, y in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]:
                        if 0 <= x < m and 0 <= y < n and grid[x][y] == 1:
                            self.union(i * n + j, x * n + y)


s = Solution()
s.numIslands(grid)
res = max(s.size)
for i in range(m):
    for j in range(n):
        if grid[i][j] == 0:
            tmp_set = set()
            for x, y in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]:
                if 0 <= x < m and 0 <= y < n and grid[x][y] == 1:
                    tmp_set.add(s.find(x * n + y))
            if len(tmp_set) == 0:
                continue
            tmp = sum(s.size[root] for root in tmp_set) + 1
            if tmp > s.cnt:
                print(s.cnt)
                quit()
            res = max(res, tmp)

print(res)

第三题只拿了60%就不用说了。。普通背包骗个分
第四题集合思想+最小公倍数,数学题
from itertools import combinations as comb
from functools import reduce

n, m = map(int, input().split())
primes = []
for _ in range(m):
    primes += [int(input())]


def gcd(x, y):
    if x % y == 0:
        return y
    else:
        return gcd(y, x % y)


def lcm(x, y):
    return x * y // gcd(x, y)


res = 0
plus = 1

for i in range(1, m + 1):
    for j in comb(primes, i):
        tmp = reduce(lcm, j)
        res += plus * (n // tmp)
    plus = - plus
print(res)


#笔试题目##拼多多#
全部评论
第二题思路:先储存整个1的个数cnt,然后遍历0,如果(i,j)为0,则从(i,j)开始dfs,上下左右搜索,若搜索的长度+1=temp(+1为算上0被替换成1的个数)<=cnt,则res = max(res,temp),最后返回res就行 时间复杂度n^3 能过70%
点赞 回复 分享
发布于 2020-09-01 21:33

相关推荐

04-30 21:35
已编辑
长安大学 C++
晓沐咕咕咕:评论区没被女朋友好好对待过的计小将可真多。觉得可惜可以理解,毕竟一线大厂sp。但是骂楼主糊涂的大可不必,说什么会被社会毒打更是丢人。女朋友体制内生活有保障,读研女朋友还供着,都准备订婚了人家两情相悦,二线本地以后两口子日子美滋滋,哪轮到你一个一线城市房子都买不起的996清高计小将在这说人家傻😅
点赞 评论 收藏
分享
05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
点赞 评论 收藏
分享
评论
1
5
分享

创作者周榜

更多
牛客网
牛客企业服务