文章
83
粉丝
0
获赞
0
访问
2.9k

评分及理由
(1)得分及理由(满分3分)
学生给出的基本设计思想是:创建一个大小为原数组最大正整数的辅助数组,初始化为0,然后遍历原数组,将正整数映射到辅助数组对应位置标记为1,最后遍历辅助数组找到第一个0的位置,其下标加1即为未出现的最小正整数。该思路在逻辑上是正确的,能够解决问题,但效率不如标准答案高(标准答案在原数组上操作,空间复杂度O(1),而学生方法需要额外数组)。根据评分要求,思路正确不扣分,因此本部分得3分。
(2)得分及理由(满分8分)
学生根据设计思想给出了C语言代码实现。代码基本实现了所述思路,但存在以下问题:
1. 当原数组最大正整数很大但数组长度n很小时(例如数组为{1000000}),辅助数组B[max]会占用大量空间,且时间效率降低,不符合题目“时间上尽可能高效”的要求(虽然时间复杂度仍为O(n+max),但max可能远大于n)。
2. 代码中最后修改了变量max的值并返回,这改变了max原本的含义(最大正整数),虽然不影响结果但不够清晰。
3. 当原数组中所有正整数都连续出现时,例如数组{1,2,3},max=3,辅助数组B全部为1,循环结束后max未被重新赋值(因为B[u]==0不成立),此时返回的max是3,而正确答案应为4。这里存在逻辑错误:未处理“所有正整数都出现”的情况,应返回max+1(即n+1?但此处max是原数组最大值,不一定等于n)。实际上对于{1,2,3},辅助数组B长度为3,全部标记为1,循环结束未找到0,应返回4(即max+1),但代码返回的是3。
因此,由于存在逻辑错误(未正确处理全连续情况),扣分。根据代码整体实现情况,扣除3分,得5分。
(3)得分及理由(满分2分)
学生给出的时间复杂度为O(2n+2k),空间复杂度为O(k)。其中k应为max(最大正整数)。该分析基本正确,但表达不够规范(通常用O(n+max)和O(max))。考虑到分析反映了算法的主要开销,且没有原则错误,给予满分2分。
题目总分:3+5+2=10分
登录后发布评论
暂无评论,来抢沙发