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

相关推荐

Noob1024:一笔传三代,人走笔还在
点赞 评论 收藏
分享
1 5 评论
分享
牛客网
牛客企业服务