作为一名计算机专业考研过来人,我深知东华大学复试机试环节的OJ系统对考生的重要性。这个"每日3题打卡"系列源于我去年备考时的真实训练记录,通过持续刷题保持编程手感,同时建立完整的错题复盘体系。112~114这三天的题目组合特别具有代表性,涵盖了动态规划、字符串处理和二叉树三大高频考点。
在复试冲刺阶段,很多同学容易陷入两个极端:要么盲目追求刷题数量,要么死磕少数难题。这个打卡计划的价值在于:
典型例题:最小路径和问题
python复制def minPathSum(grid):
m, n = len(grid), len(grid[0])
dp = [[0]*n for _ in range(m)]
dp[0][0] = grid[0][0]
# 初始化第一行和第一列
for i in range(1, m):
dp[i][0] = dp[i-1][0] + grid[i][0]
for j in range(1, n):
dp[0][j] = dp[0][j-1] + grid[0][j]
# 状态转移
for i in range(1, m):
for j in range(1, n):
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
return dp[-1][-1]
关键训练点:
注意:东华OJ的测试用例常包含m=1或n=1的边界情况,必须单独验证
KMP算法实现要点:
python复制def build_lps(pattern):
lps = [0] * len(pattern)
length = 0
i = 1
while i < len(pattern):
if pattern[i] == pattern[length]:
length += 1
lps[i] = length
i += 1
else:
if length != 0:
length = lps[length-1]
else:
lps[i] = 0
i += 1
return lps
def kmp_search(text, pattern):
lps = build_lps(pattern)
i = j = 0
while i < len(text):
if text[i] == pattern[j]:
i += 1
j += 1
if j == len(pattern):
return i - j
else:
if j != 0:
j = lps[j-1]
else:
i += 1
return -1
易错点分析:
锯齿形层次遍历实现:
python复制from collections import deque
def zigzagLevelOrder(root):
if not root: return []
queue = deque([root])
res = []
level = 0
while queue:
size = len(queue)
current_level = []
for _ in range(size):
node = queue.popleft()
current_level.append(node.val)
if node.left: queue.append(node.left)
if node.right: queue.append(node.right)
if level % 2 == 1:
current_level = current_level[::-1]
res.append(current_level)
level += 1
return res
技巧提示:
我采用的训练流程:
建立错误类型标签:
东华OJ特有注意事项:
案例:使用递归实现DP导致栈溢出
python复制# 错误示范
def dfs(i, j):
if i == 0 and j == 0:
return grid[0][0]
if i < 0 or j < 0:
return float('inf')
return min(dfs(i-1,j), dfs(i,j-1)) + grid[i][j]
改进方案:
字符串匹配的Rabin-Karp算法实现:
python复制def rabin_karp(text, pattern):
d = 256 # 字符集大小
q = 9997 # 大素数
m, n = len(pattern), len(text)
h = pow(d, m-1) % q
p = t = 0
# 计算初始哈希
for i in range(m):
p = (d*p + ord(pattern[i])) % q
t = (d*t + ord(text[i])) % q
for i in range(n-m+1):
if p == t:
if text[i:i+m] == pattern:
return i
if i < n-m:
t = (d*(t-ord(text[i])*h) + ord(text[i+m])) % q
if t < 0:
t += q
return -1
东华OJ常见输入格式处理:
python复制import sys
def process_input():
# 多测试用例带空行分隔的情况
data = sys.stdin.read().split('\n')
idx = 0
while idx < len(data):
if not data[idx].strip():
idx += 1
continue
n = int(data[idx])
matrix = []
for _ in range(n):
idx += 1
matrix.append(list(map(int, data[idx].split())))
yield matrix
idx += 1
基础巩固期(30天):
专题突破期(20天):
模拟冲刺期(10天):
东华特色题库:
题目选择顺序:
时间分配建议:
这套打卡方法让我在去年复试中取得了机试满分,关键不在于刷题数量,而在于建立系统的解题思维框架。现在回头看112~114这三天的记录,发现当时纠结的DP状态定义问题,后来成了我最擅长的题型之一。建议每刷完20题就做一次专题总结,会发现很多题目本质上是相同解法的不同表现形式。