文章
78
粉丝
0
获赞
0
访问
3.7k
(1)算法思想:用一个长度为n+1的数组B记录A内元素的个数,然后遍历B数组,找到元素大于(n/2)的索引,此索引即为A的主元素,否则输出-1;
步骤:1.声明一个长度为n+1的B数组;
2.遍历A数组,使B数组记录A中元素的个数;
3.遍历B数组,找到B中大于n/2的元素,输出其索引。如果小于n/2,输出-1;
(2)
void find_main_elem(int a[],int n){
int *b = (int *)malloc(sizeof(int)*(n+1)); //声明一个长度为n+1的数组
memset(b,0,sizeof(int)*(n+1));
int i=0;
for(i=0;i<n;i++){ //遍历A数组,让B数组记录A中元素的个数
b[a[i]]+=1;
}
int flag = -1;
for(i=0;i<n+1;i++){ //找到B中元素大于n/2的索引,并赋值给flag;
if(b[i]>n/2){
flag = i;
break;
}
}
printf("%d",flag); //输出结果
}
(3)时间复杂度:O(n) 空间复杂度:O(n)
评分及理由
(1)得分及理由(满分4分)
得分:2分
理由:学生的算法思想与标准答案不同,但思路正确且可行。使用了辅助数组统计元素出现次数,符合题目要求。但未提及“候选主元素”的概念,且空间复杂度较高,扣2分。
(2)得分及理由(满分7分)
得分:5分
理由:代码实现了学生的算法思想,逻辑正确,但存在以下问题:
1. 未返回结果,而是直接打印,与题目要求的输出方式不符(扣1分)。
2. 未释放动态分配的内存(扣1分)。
其他部分逻辑正确,代码清晰。
(3)得分及理由(满分2分)
得分:2分
理由:时间复杂度和空间复杂度的分析正确,与算法实现一致。
题目总分:2+5+2=9分
登录后发布评论
暂无评论,来抢沙发