文章
211
粉丝
0
获赞
0
访问
45.9k
(1)利用相邻特性:由于相同元素一定相邻,可以遍历数组,每次比较相邻的两个元素。如果 A[i] == A[i+1],说明这两个是成对出现的元素,可以直接跳过 i+1,检查 i+2。如果 A[i] != A[i+1],则 A[i] 就是只出现一次的元素(因为相同元素一定相邻,如果不相同,说明 A[i] 没有配对)。如果遍历到最后仍未找到单独元素,则最后一个元素一定是单独出现的。
(2)
int findSingleElement(const vector<int>& nums) {
int left = 0;
int right = nums.size() - 1;
while (left < right) {
int mid = left + (right - left) / 2;
// 确保 mid 是偶数,以便检查 mid 和 mid+1
if (mid % 2 == 1) {
mid--;
}
if (nums[mid] == nums[mid + 1]) {
// 如果 nums[mid] == nums[mid+1],说明单独元素在右侧
left = mid + 2;
} else {
// 否则单独元素在左侧(包括 mid)
right = mid;
}
}
return nums[left];
}
(3)o(logn)
评分及理由
(1)得分及理由(满分3分)
得分:3分
理由:学生的设计思想与标准答案一致,利用了相邻元素的特性,通过遍历比较相邻元素来找出单独出现的元素。思路清晰且正确,不扣分。
(2)得分及理由(满分8分)
得分:5分
理由:学生的代码实现与设计思想不一致。设计思想是基于顺序遍历,但代码实现使用了二分查找(时间复杂度为O(logn)),逻辑上虽然正...
登录后发布评论
暂无评论,来抢沙发