文章
73
粉丝
0
获赞
1
访问
6.4k
(1)开辟一个长为 n 的数组。记录 A 中的元素、遍历A获得每一元素的大小,遍历新数组获得大于n/2 的元素的存在。
(2)
int Solution(int *A, int n){
int *B = (int*)malloc(n*sizeof(int));
for(int i=0;i<n;i++) {
B[i] = 0; // 将数组 B 设初值 0
}
for(int i=0;i<n;i++) {
int x = A[i];
B[x]++; // 遍历元素个数
}
for(int i=0, i<n, i++) {
if (B[i]] > n/2){
return i; // 找到主元素。直接返回。
}
}
return -1; // 未找到主元素。
}
(3)三次循环遍历数组。时间复杂度O(n),
开辟了一个大小为n 的新数组B。空间复杂度O(n)。
评分及理由
(1)得分及理由(满分4分)
得分:2分
理由:学生的设计思想是使用一个辅助数组来统计每个元素的出现次数,然后遍历辅助数组找到主元素。虽然思路正确,但相比标准答案的摩尔投票法,效率较低,且没有体现出“尽可能高效”的要求。因此扣2分。
(2)得分及理由(满分7分)
得分:5分
理由:学生的代码实现了设计思想,但存在以下问题:
for(int i=0, i<n, i++)
),应扣1分。if (B[i]] > n/2)
中多了一个右方括号,应扣1分。(3)得分及理由(满分2分)
得分:2分
理由:学生正确分析了算法的时间复杂度(O(n))和空间复杂度(O(n)),与实现一致,因此不扣分。
题目总分:2+5+2=9分
登录后发布评论
暂无评论,来抢沙发