文章
14
粉丝
0
获赞
0
访问
1.3k
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分
登录后发布评论
暂无评论,来抢沙发