文章

57

粉丝

0

获赞

0

访问

6.8k

头像
2018年(408)计算机学科专业基础综合试题 - 第41题回答
数据结构
发布于2025年11月27日 23:58
阅读数 6

1. 创建一个辅助数组,其索引代表我们要关心的正整数。遍历原始数组,对于每一个在有效范围内的正整数,我们就在辅助数组的对应位置做一个“已出现”的标记(例如,将值设为1)。最后,我们只需要从最小的正整数(1)开始,检查辅助数组,第一个没有被标记的位置,其对应的正整数就是我们要找的答案。

2. 

int func(int a[], int n) {
    // 分配 n+1 个空间,索引 0 到 n
    int *temp = (int*)malloc(sizeof(int) * (n + 1));
    if (temp == NULL) return -1; // 内存分配失败
    // 初始化:只循环 n+1 次
    for (int i = 0; i < n + 1; i++) {
        temp[i] = 0;
    }
    // 标记:只标记在 1 到 n 范围内出现的数字
    for (int j = 0; j < n; j++) {
        // 优化:只关心正整数。负数和0不影响最小正整数的判断。
        if (a[j] >= 1 && a[j] <= n) {
            temp[a[j]] = 1; // 直接标记为1即可
        }
    }
    // 查找:在 1 到 n 的范围内查找
    for (int k = 1; k <= n; k++) {
        if (temp[k] == 0) {
            return k; // 在1到n范围内找到缺失的数
        }
    }
    // 如果1到n都出现了,那么答案就是n+1
    return n + 1;
}

3. 时间复杂度:O(n),空间复杂度:O(n)


评分及理由

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

得分:3分

理由:学生的基本设计思想正确。通过创建辅助数组标记出现的正整数,然后查找第一个未标记的位置,思路清晰且符合题目要求。虽然与标准答案的原地标记方法不同,但思路正确不扣分。

(2)得分及理由(...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发