文章

100

粉丝

0

获赞

0

访问

12.5k

头像
2018年计算机学科专业基础综合试题 - 第41题回答
数据结构
发布于2025年8月12日 18:12
阅读数 108

(1)思想:用一个长度为n+2的数组b,来存储该数组里的正整数的出现情况,用1表示存在,0表示不存在。遍历数组b,第一次出现0,即该索引(不为0)即未出现的最小正整数。

步骤:1.假设该数组为a = {-5,2,3},声明一个长度为4的数组b;

2.则b = {0,0,1,1,0};3.遍历b,b[1] = 0 ,所以未出现的正整数为1.

(2)

int f(int a[],int n){
int *b = (int *)malloc(sizeof(int)*(n+2)); //声明长度为n+2的数组
memset(b,0,sizeof(int)*(n+2)); //将b数组内的元素全部初始化为0
int i=0, result;
for(i=0;i<n;i++){ //用数组b存储数组a出现的正整数的情况
if(b[a[i]]==0){
b[a[i]] = 1;
}
}
for(i = 1;i<n+2;i++){ //遍历数组b,第一次出现0的索引即为结果
if(b[i]==0){
result = i;
break;
}
}
free(b);
return result; //返回结果
}

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


评分及理由

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

得分:3分

理由:学生的设计思想与标准答案不同,但思路正确且清晰。通过使用辅助数组来标记正整数的出现情况,能够有效解决问题。因此不扣分。

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

得分:7分

理由:学生的代码实现了其设计思想,但存在以下逻辑错误:

  1. 未处理输入数组中的非正整数(如负数或0),直接将其作为索引访问辅助数组b,可能导致数组越界或错误标记。
  2. 未考虑输入数组中可能包含大于n的正整数,这些数不应被标记在辅助数组b中。

因此扣1分。

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

得分:2分

理由:学生正确分析了算法的时间复杂度和空间复杂度,与标准答案一致,因此不扣分。

题目总分:3+7+2=12分

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发