问题描述
一年一度的优秀项目组初选评比开始了!每个项目组都有一个独特的编号,但有趣的是,除了一个项目组之外,所有其他项目组的编号都恰好出现了两次(因为每个项目组都有一个小分组)。班长小C需要快速找出那个独特的项目组编号,以便通知他们直接进入下一轮评选。
要求:
- 设计一个算法,在 O(n) 的时间内找到独特的项目组编号,其中 n 是项目组的数量。
- 尽量减少额外空间的使用,以体现你的算法优化能力。
测试样例
样例1:
输入:
groups = [101, 101, 202, 202, 303, 303, 404, 505, 505]输出:404解释:编号 404 的项目组是唯一没有配对的,直接进入下一轮。
样例2:
输入:
groups = [0, 1, 0, 1, 2]输出:2解释:编号 2 的项目组只出现一次,是独特的。
样例3:
输入:
groups = [7, 3, 3, 7, 10]输出:10解释:10 是唯一的独特编号,直接晋级。
约束条件
- 1 ≤ groups.length ≤ 1001
- 0 ≤ groupsi ≤ 1000
- 项目组数量为奇数
- 除了一个项目组编号只出现一次外,其余每个编号都恰好出现两次
程序代码
#include <stdio.h>
int findUnique(int* groups, int groupsSize) {
int result = 0;
for (int i = 0; i < groupsSize; i++) {
result ^= groupsi;
}
return result;
}
int main() {
int groups1\[\] = {101, 101, 202, 202, 303, 303, 404, 505, 505};
int groups2\[\] = {0, 1, 0, 1, 2};
int groups3\[\] = {7, 3, 3, 7, 10};
printf("%d\n", findUnique(groups1, 9)); // 404
printf("%d\n", findUnique(groups2, 5)); // 2
printf("%d\n", findUnique(groups3, 5)); // 10
return 0;
}
cpp
#include <stdio.h>
int findUnique(int* groups, int groupsSize) {
int result = 0;
for (int i = 0; i < groupsSize; i++) {
result ^= groups[i];
}
return result;
}
int main() {
int groups1[] = {101, 101, 202, 202, 303, 303, 404, 505, 505};
int groups2[] = {0, 1, 0, 1, 2};
int groups3[] = {7, 3, 3, 7, 10};
printf("%d\n", findUnique(groups1, 9)); // 404
printf("%d\n", findUnique(groups2, 5)); // 2
printf("%d\n", findUnique(groups3, 5)); // 10
return 0;
}
运行结果
