文章
4
粉丝
0
获赞
0
访问
481
1.从头遍历一遍数组,用比较两个元素并用一个整数纪录每个元素出现的个数,若两个数不同且记录的数不是2,就找到了出现一次的元素
2.
int find(int a[]){
int cnt = 1;//记录每个元素出现的次数
int ans;
for(int i=2;;i++){//假设数组起始下标为1
if(a[i]!=a[i-1]&&cnt!=2){
ans = i;//ans即为所求
break;//找到了直接跳出循环
}
if(a[i]==a[i-1]){//两个相等就cnt++
cnt++;
}
if(a[i]==a[i-1]&&cnt==2){//两个不等但是cnt为2说明前面一个字符出现了两次
cnt = 1;
}
return ans;
}
3.算法时间复杂度为O(n)
评分及理由
(1)得分及理由(满分3分)
得分:1分
理由:学生的设计思想虽然提到了遍历数组和记录元素出现次数,但描述不够清晰,且未明确指出“仅比较偶数坐标元素”这一关键点。此外,逻辑上存在冗余(如记录次数并判断是否为2),不符合题目要求的“高效”设计。
(2)得分及理由(满分8分)
得分:3分
理由:
cnt
统计次数并判断是否为2,与题目要求的“相同元素一定相邻”条件不符,导致算法效率降低。for(int i=2;;i++)
中的中文括号和缺少终止条件。i
而非元素值a[i]
。(3)得分及理由(满分2分)
得分:1分
理由:虽然学生正确指出时间复杂度为O(n),但因其算法实际逻辑错误(如循环可能无限执行或返回错误结果),时间复杂度分析的前提不成立,故扣1分。
题目总分:1+3+1=5分
登录后发布评论
暂无评论,来抢沙发