9.4字节笔试

算法岗位笔试,四道编程
1. 棋盘每个位置为-1,0,或者得分。-1则往左下或右下走,0和对应得分往下掉。求从第一行开始能够得到的最大得分。
思路:感觉就是个dp从下往上,返回第一行最大的即可,但是最后只过了60%的case,不是很懂为什么,贴一下代码求解答。
import sys
s = list(sys.stdin.readline().strip().split(' '))
n, m = int(s[0]), int(s[1])
arr = []
for i in range(n):
    arr.append(list(map(int,input().split())))
dp = [[0 for _ in range(m)] for _ in range(n)]
dp[n-1] = arr[n-1]
for i in range(n-2,-1,-1):
    for j in range(m):
        if arr[i][j] == -1:
            if j-1>=0 and j<=m-2:
                dp[i][j] = max(dp[i+1][j-1],dp[i+1][j+1])
            elif j-1<0 and j<=m-2:
                dp[i][j] = dp[i+1][j+1]
            elif j-1>=0 and j>m-2:
                dp[i][j] = dp[i+1][j-1]

        else:
            dp[i][j] = dp[i+1][j]+arr[i][j]
print(max(dp[0]))

2. 数组中判断有无三个数对应index i<j<k的和也在数组中,输出YES or NO.
思路:直接挨个遍历数组,每次将所有的连续的和存起来,在用set判断是否存在,但是我好像只考虑了三个连着的时候,最后通过了90%的case。
t = int(input().strip())
for i in range(t):
    n = int(input().strip())
    arr = list(map(int, input().split()))
    s = set(arr)
    nums = []
    flag = True
    for i in range(n - 2):
        num = arr[i] + arr[i + 1] + arr[i + 2]
        nums.append(num)
    for num in nums:
        if num not in s:
            flag = False
    if flag:
        print("YES")
    else:
        print("NO")

3. 第三题如果没记错的话是和leetcode424非常像,但是多了一个条件是每个位置都对应0或1,0表示不能替换,1表示可以替换。
这个地方我直接按照lc424去做了,但是位置能否替换的条件一直没想出来,样例过了但是用例没过。

4. 什么A/B test实验的问题,已经没有时间看了,果断放弃。。。


#字节笔试##字节跳动##字节#
全部评论
第一题dp[n - 1][j]也就是最后一行可能是-1
1 回复 分享
发布于 2022-09-04 23:12 天津
前三题跟你一样,第4题我写出来了也超时了,只过了50%用例
点赞 回复 分享
发布于 2022-09-05 01:02 吉林

相关推荐

每晚夜里独自颤抖:这个在牛客不是老熟人了吗
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
6
分享

创作者周榜

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