文章

14

粉丝

0

获赞

0

访问

1.3k

头像
2025 年 5 月第 1 次 408 月考试卷 - 第41题回答
数据结构
发布于2025年11月1日 21:02
阅读数 120

1.从数组开头开始,以两个元素为一组(下标 0 和 1,2 和 3,...),依次检查每组是否相等。一旦发现某组两个元素不相等,则该组的第一个元素就是只出现一次的元素。若所有组都相等,则最后一个元素(数组长度为奇数时)即为答案。

2.

#include <vector>

using namespace std;

 int findSingleElement(const vector<int>& nums) {
       // 从下标0开始,每次检查两个相邻元素(成对检查)
       for (int i = 0; i < nums.size() - 1; i += 2) {
              // 如果当前元素与其后一个元素不相等,说明当前元素就是只出现一次的那个(因为它没有配对)
              if (nums[i] != nums[i + 1]) { return nums[i]; }
       }
       // 如果所有前面的成对元素都相等,那么最后一个元素就是只出现一次的(数组长度为奇数)
       return nums.back();
}

 

3.时间复杂度O(N)


评分及理由

(1)得分及理由(满分3分)

学生答案与标准答案基本一致:通过遍历偶数下标元素并与后一个元素比较,找到第一个不匹配的元素。思路正确且完整。得3分。

(2)得分及理由(满分8分)

算法实现与标准答案逻辑一致,使用vector容器但核心逻辑相同。代码注释清晰,边界处理正确(通过返回最后一个元素处理目标在末尾的情况)。但存在以下问题:
- 函数参数使用const vector&,比标准答案的数组指针更安全,但题目要求C或C++,不扣分
- 循环条件使用nums.size()-1,与标准答案的n-1等价
- 返回nums.back()与标准答案返回A[n-1]等价
代码逻辑完全正确,得8分。

(3)得分及理由(满分2分)

正确分析时间复杂度为O(N),与标准答案一致。得2分。

题目总分:3+8+2=13分

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发