文章
57
粉丝
0
获赞
0
访问
6.8k
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)得分及理由(...
登录后发布评论
暂无评论,来抢沙发