文章

83

粉丝

0

获赞

0

访问

2.9k

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


评分及理由

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

学生给出了两种思路。第一种思路(设置z_min并遍历两次)是错误的,因为如果数组是{2, 3, 4},z_min从1开始,遍历时找不到1,z_min不会增加,最终返回1,但实际未出现的最小正整数是1,这里恰好正确,但若数组是{1, 2, 100},第一次遍历遇到1,z_min变为2,第二次遍历遇到2,z_min变为3,最终返回3,但实际未出现的最小正整数是3,也正确,然而该方法依赖于两次遍历且z_min在遍历过程中可能被多次修改,逻辑不严谨,对于某些情况可能出错(例如数组{1, 3, 4},第一次遍历后z_min=2,第二次遍历找不到2,最终返回2,正确,但若数组{2, 1},第一次遍历后z_min=3?实际上第一次遍历:z_min=1,遇到1后变为2,遇到2后变为3,第二次遍历无变化,返回3,但正确答案是3?不对,未出现的最小正整数是3,正确。但该方法要求遍历两次,且z_min在遍历中递增,但若最小正整数出现在较大值之后,可能漏判。标准算法要求高效且正确,该思路虽然可能得到正确结果,但并非“时间上尽可能高效”的算法(时间复杂度O(n)但需两次遍历,且逻辑有缺陷),因此不能给满分。第二种思路(建新数组)基本正确,但未说明新数组大小应为n或max的较小者,且未处理max可能很大的情况。综合考虑,学生给出了部分正确思路,但第一种思路有缺陷,第二种思路描述不够精确,扣1分。

得分:2分

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

学生根据第二种思路实现了代码。代码基本正确,但存在以下问题:
1. 新数组B的大小设置为max(原数组最大正整数),若max很大(例如10^9)但n很小,则空间浪费严重,且可能栈溢出。标准答案利用原数组标记,空间复杂度O(1)。此处逻辑有缺陷,但根据题目要求“时间上尽可能高效”,该代码时间复杂度为O(n+max),当max远大于n时效率低下。
2. 代码中最后修改了max变量并返回,这改变了max的原意,且若新数组B全为1(即1~max都出现了),则循环结束后max不变,返回的是原数组最大值,而正确答案应为max+1。例如数组{1,2,3},max=3,B[0]=1, B[1]=1, B[2]=1,循环找不到B[u]==0,u循环结束,max仍为3,返回3,但正确答案是4。此处逻辑错误。
3. 未考虑数组...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发