算法岗位笔试,四道编程
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实验的问题,已经没有时间看了,果断放弃。。。
#字节笔试##字节跳动##字节#