文章
75
粉丝
78
获赞
0
访问
4.1k

评分及理由
(1)得分及理由(满分3分)
学生给出的基本设计思想是“空间换时间”,使用一个大小为 n 的辅助数组 B,将原数组中大于 0 的元素值 x 放入 B[x] 位置,然后从下标 1 开始遍历 B,找到第一个值为 0 的位置,该下标即为未出现的最小正整数。该思路正确,能够解决问题,且时间复杂度为 O(n),空间复杂度为 O(n)。虽然与标准答案(原地哈希)的具体实现方法不同,但根据“思路正确不扣分”原则,此处不扣分。得3分。
(2)得分及理由(满分8分)
学生根据设计思想给出了 C 语言代码描述。但代码中存在以下逻辑错误:
1. 内存分配错误:`int *B=(int *)malloc(sizeof(int));` 只分配了 1 个 int 的空间,但后续却当作大小为 n 的数组使用,这会导致数组越界,是严重的逻辑错误。正确的分配应为 `int *B = (int *)malloc(n * sizeof(int));` 或 `int *B = (int *)calloc(n, sizeof(int));`。
2. 边界条件处理不完整:代码中 `for(int p = 1; p < n; p++)` 遍历辅助数组 B 时,下标从 1 到 n-1。如果数组 A 中包含了 1 到 n 的所有正整数,那么 B[1] 到 B[n-1] 都不为 0,循环结束后函数没有返回值(缺少 `return n+1;` 或类似语句),这会导致未定义行为。
3. 辅助数组初始化与使用逻辑存在瑕疵:学生思路是将正整数 x 放到 B[x],但若 x > n,这个操作会导致数组 B 越界。虽然题目未明确说明数组元素范围,但一个健壮的算法应处理这种情况。不过,考虑到学生思路的核心是“用辅助数组标记出现过的 1~n 的正整数”,对于 x > n 的数可以忽略,但代码中未体现这一忽略逻辑,若 A[j] > n,执行 `B[k]=A[j];` 仍会越界。
基于以上逻辑错误,尤其是内存分配的根本性错误和返回值缺失,严重影响了算法的正确性。根据打分要求,应对逻辑错误扣分。考虑到思路框架正确,但实现有重大缺陷,扣除大部分分数。得2分。
(3)得分及理由(满分2分)
学生正确说明了算法的时间复杂度为 O(n),空间复杂度为 O(n)。这与基于其设计思想(使用额外大小为 n 的数组)的分析结果一致。得2分。
题目总分:3+2+2=7分
登录后发布评论
暂无评论,来抢沙发