文章
5
粉丝
0
获赞
0
访问
18

评分及理由
(1)得分及理由(满分3分)
得分:3分。学生答案中描述了基本设计思想:“把当前指针指向元素与下一个相比较 a[i] 与 a[i + 1],若相同则主循环直接加2,若a[i] 与 a[i+1] 不同则说明是单独元素要输出。” 这一思路与标准答案一致,即利用相同元素相邻的性质,通过比较相邻元素找出单独出现一次的元素。虽然表述略显冗余,但核心逻辑正确,因此得满分。
(2)得分及理由(满分8分)
得分:7分。学生的代码实现为:
void search() { //数组 a[n]声明全局变量
for(int i = 0; i <= n - 1; i++) {
if(a[i] == a[i + 1]) i++;
else std::cout << a[i] << " ";
}
}
该代码存在逻辑错误:循环条件是 i <= n - 1,即 i < n,但在循环体内访问 a[i + 1],当 i = n - 1 时会发生数组越界。此外,当 a[i] == a[i + 1] 时,通过 i++ 跳过下一元素,但由于循环本身有 i++,实际效果是下标跳过了两个元素,与思路一致;但当 a[i] != a[i + 1] 时,直接输出 a[i],但后续循环仍会继续,可能输出多个元素,不符合题目要求只输出一个目标值。标准答案要求函数返回目标值,而学生代码输出所有可能的单独元素(在数组有多个不相邻的单独元素时可能输出多个),但题目明确只有一个元素出现一次,因此输出一个即可,这里由于越界和输出多个可能存在风险,但从具体场景看,若数组符合条件,该代码会在遇到第一个不相等对时输出并继续遍历,可能输出多余值或访问越界。由于代码逻辑整体框架正确(比较相邻、跳过成对),主要问题在于循环条件导致越界以及输出方式不规范(应返回而非输出所有)。考虑到手写代码的常见失误,且核心思路正确,酌情扣1分。
(3)得分及理由(满分2分)
得分:2分。学生正确指出时间复杂度为O(n),并解释了遍历数组的时间开销,表述合理,得满分。
题目总分:3+7+2=12分
登录后发布评论
暂无评论,来抢沙发