文章

25

粉丝

0

获赞

0

访问

2.0k

头像
2025 年 6 月第 1 次 408 月考试卷 - 第41题回答
数据结构
发布于2025年9月22日 16:51
阅读数 64


评分及理由

(1)得分及理由(满分4分)

学生答案的基本设计思想是:先正序遍历数组找到所有峰,并用数组h[i]记录到当前位置i为止的最大峰值,同时记录第一个峰的位置f。然后倒序遍历数组,遇到谷时,计算当前谷与之前记录的最大峰值h[i]的差值,并更新最大差值。该思路与标准答案不同,但也是正确的,因为对于每个谷,它只需要与它之前(即下标小于等于i)的最大峰相减,即可得到可能的最大差值(注意:峰必须在谷之前,即i

(2)得分及理由(满分7分)

学生提供的代码存在多处逻辑错误和语法错误:
1. 数组h[n]未初始化:在第一个for循环中,h[i]依赖于h[i-1],但h[0]未初始化(i从1开始,但h[0]未定义)。这会导致未定义行为。
2. 变量f的用法错误:f用于记录第一个峰的位置,但条件"if (f != 0) f = i"逻辑错误(应为if (f == 0) f = i),这会导致f始终不会被设置为第一个峰(除非f初始为0,但第一次遇到峰时f为0,条件f!=0不成立,所以f不会被更新)。
3. 峰和谷的判断条件中,数组索引范围问题:在倒序遍历时,i从n-2开始,但判断谷的条件中使用了A[i-1]和A[i+1],当i为n-2时,i+1为n-1(有效),但i为f时,i-1可能为0(有效),但注意f是第一个峰的位置,而倒序遍历时i>=f,但谷可能出现在峰之前?实际上,峰必须在谷之前(if),但代码中倒序遍历的i(即谷的下标)可能小于f?不对,因为i>=f,所以谷的下标j>=f,但峰的下标i<=j(因为h[i]记录的是到i为止的最大峰,而i<=j),所以这里实际上允许了峰和谷在同一个位置?但同一个位置不可能同时是峰和谷。而且,问题要求峰在谷之前(i=f),所以峰的下标<=谷的下标,这违反了i 4. 代码语法错误:max函数未定义(C语言中无max函数,需自己实现或使用宏),且数组h声明为int h[n],但未初始化h[0]。
5. 倒序遍历的循环条件为i>=f,但f是第一个峰的位置,而谷可能出现在最后一个峰之后?实际上,谷应该在峰之后,但这里倒序遍历从后往前,可能会漏掉一些谷?但问题不大。主要错误是峰和谷的下标关系不满足i 基于以上逻辑错误,扣分严重。但考虑到学生思路正确(尽管实现有误),给予部分分数。扣4分,得3分。

(3)得分及理由(满分2分)

学生正确分析了时间复杂度和空间复杂度,均为O(n),与标准答案一致。得2分。

题目总分:4+3+2=9分

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发