文章

1

粉丝

0

获赞

0

访问

23

头像
2025 年 5 月第 1 次 408 月考试卷 - 第41题回答
数据结构
发布于2025年7月14日 17:41
阅读数 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)),逻辑上虽然正...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发