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实验的问题,已经没有时间看了,果断放弃。。。