文章
156
粉丝
195
获赞
0
访问
28.4k
(1) 基本思想:利用相同元素相邻的特性,使用二分查找,每次比较中间偶数位置与其下一位置的值,相等则单独元素在右,否则在左。
(2)
int findSingle(int arr[], int n) {
int low = 0, high = n - 1;
while (low < high) {
int mid = low + (high - low) / 2;
// 保证 mid 是偶数下标,这样 arr[mid] 是某对的第一项
if (mid % 2 == 1) {
mid--;
}
// 检查 mid 和 mid+1 是否相等
if (arr[mid] == arr[mid + 1]) {
// 前面都是成对的,单独元素在右边
low = mid + 2;
} else {
// 单独元素在左边(包括 mid)
high = mid;
}
}
return arr[low];
}
(3) 时间复杂度:O(logn)O(logn)。
评分及理由
(1)得分及理由(满分3分)
得分:3分
理由:学生的基本设计思想正确,利用了相同元素相邻的特性,并提出了二分查找的思路。虽然与标准答案的顺序遍历方法不同,但思路正确且高效,符合题目要求,因此不扣分。
(2)得分及理由(满分8分)
得分:8分
理由:学生实现了二分查找算法,代码逻辑正确。通过调整mid为偶数下标,确保比较的是同一对元素,然后根据arr[mid]与arr[mid+1]是否相等来缩小查找范围。代码注释清晰,关键步骤有解释,符合题目要求,没有逻辑错误。
(3)得分及理由(满分2分)
得分:2分
理由:学生正确分析了算法的时间复杂度为O(log n),与二分查找的特性一致,且比标准答案的O(n)更高效,符合题目要求。
题目总分:3+8+2=13分
登录后发布评论
暂无评论,来抢沙发