笔试后:小马智行题目讨论

第一题:分糖果
n, k = 5, 10
A = [2,1,5,2,4]

tmp = []
for i in range(len(A)):
    tmp.append([A[i], i+1])

tmp.sort(key=lambda x: x[0])

target = k
n = len(A)
pre = 0
for i in range(len(tmp)):
    if (tmp[i][0] - pre) * n < target:
        target -= (tmp[i][0] - pre) * n
        pre = tmp[i][0]
        n = len(A) - i - 1
    elif (tmp[i][0] - pre) * n == target:
        print(len(A))
    else:
        break

index = target % n
candidate = tmp[i:]
candidate.sort(key=lambda x:x[1])
print(candidate[index-1][1])
第二题:
递归:也错了(30%)
import functools  nums = list(map(int, input().split(" ")))
n, m = nums[0], nums[1]

arr = [[0] * m for _ in range(n)]

def trans(s):
    if s == '^':
        return (-1, 0)
    elif s == 'v':
        return (1, 0)
    elif s == '<':
        return (0, -1)
    elif s == '>':
        return (0, 1)
    else:
        return (5, 5)

for i in range(n):
    ss = list(input())
    for j in range(m):
        arr[i][j] = trans(ss[j])

flag = [[0] * m for _ in range(n)]  @functools.lru_cache(None) def dfs(i, j):
    if i < 0&nbs***bsp;j < 0&nbs***bsp;i == n&nbs***bsp;j == m:
        return 0

    if flag[i][j] == 1:
        flag[i][j] = 0
        return 0

    flag[i][j] = 1
    cur_i, cur_j = arr[i][j]
    dist = dfs(i+cur_i, j+cur_j)
    flag[i][j] = 0
    return dist + 1

maxlength = 0
for i in range(n):
    for j in range(m):
        if dist[i][j] == -1:
            maxlength = max(maxlength, dfs(i, j))

print(maxlength)
非递归:错了(10%)
nums = list(map(int, input().split(" ")))
n, m = nums[0], nums[1]

arr = [[0] * m for _ in range(n)]

def trans(s):
    if s == '^':
        return (-1, 0)
    elif s == 'v':
        return (1, 0)
    elif s == '<':
        return (0, -1)
    else:
        return (0, 1)

for i in range(n):
    ss = list(input())
    for j in range(m):
        arr[i][j] = trans(ss[j])

flag = [[0] * m for _ in range(n)]
dist = [[-1]*m for _ in range(n)]

def dfs(i, j):
    stack = []
    sign = True
    ring = None
    while stack&nbs***bsp;sign == True:
        sign = False
        if i < 0&nbs***bsp;j < 0&nbs***bsp;i == n&nbs***bsp;j == m:
            break

        if flag[i][j] == 1:
            ring = (i, j)
            break

        if dist[i][j] != -1:
            curdist = dist[i][j]
            for i in range(len(stack) - 1, -1, -1):
                cur_i, cur_j = stack[i]
                curdist += 1
                dist[cur_i, cur_j] = curdist
            return curdist

        flag[i][j] = 1
        stack.append((i, j))
        next_i, next_j = arr[i][j]
        i, j = i + next_i, j +next_j

    if not ring:
        curdist = 0
        for i in range(len(stack)-1, -1, -1):
            cur_i, cur_j = stack[i]
            curdist += 1
            dist[cur_i][cur_j] = curdist
    else:
        curdist = 0
        index = 0
        for i in range(len(stack)-1, -1, -1):
            cur_i, cur_j = stack[i]
            curdist += 1
            if cur_i == ring[0] and cur_j == ring[1]:
                index = i
                break
        for i in range(len(stack)-1, -1, -1):
            cur_i, cur_j = stack[i]
            if i > index:
                dist[cur_i][cur_j] = curdist
            else:
                curdist += 1
                dist[cur_i][cur_j] = curdist

    return curdist

maxlength = 0
for i in range(n):
    for j in range(m):
        if dist[i][j] == -1:
            maxlength = max(maxlength, dfs(i, j))

print(maxlength)
第三题:没有看见不可以重复使用,写的动态规划的子序列问题,我说我怎么总比答案多



#小马智行笔试#
全部评论
nnd,用pre存每个人已经到手的糖,我怎么想不到😤每次都从数组里减去,难怪超时。
2
送花
回复 分享
发布于 2022-09-16 22:41 北京
第一题100%希望大哥们分享一下其他思路
点赞
送花
回复 分享
发布于 2022-09-16 22:34 北京
国泰君安
校招火热招聘中
官网直投
有兴趣试试华勤技术吗,我主页有校招详情和内推码
点赞
送花
回复 分享
发布于 2022-09-16 23:32 江苏
hi~同学,秋招遇“寒气”,牛客送温暖啦!23届秋招笔面经有奖征集中,参与就得牛客会员7天免费体验,最高赢300元京东卡!戳我去看>>>https://www.nowcoder.com/link/zhengjipinglun
点赞
送花
回复 分享
发布于 2022-09-19 08:17 北京

相关推荐

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