文章
1
粉丝
0
获赞
0
访问
23
(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)),逻辑上虽然正...
登录后发布评论
暂无评论,来抢沙发