文章

75

粉丝

78

获赞

0

访问

4.1k

头像
2018年(408)计算机学科专业基础综合试题 - 第41题回答
数据结构
发布于2025年12月5日 17:06
阅读数 42


评分及理由

(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分

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发