问题描述
小M是一位勇敢的太空探险家,他在探索一颗神秘星球时发现了一串奇特的能量石序列。这些能量石上刻有不同的整数能量值,但奇怪的是,除了一个能量石的能量值之外,其他所有能量值都恰好出现了两次。传说中,那个独特的能量石是打开星球宝藏的关键!小M需要你的帮助,快速找出那个独特能量石的能量值,以便继续他的冒险。
要求:
- 设计一个算法,在 O(n) 的时间复杂度内找出只出现一次的能量值,其中 n 是能量石的数量。
- 尽量减少额外空间的使用,以展现你的算法优化技巧。
测试样例
样例1:
输入:
energyStones = [5, 3, 5, 2, 3, 8, 8]输出:2解释:能量值 5、3、8 都出现了两次,只有 2 出现一次,因此 2 是独特的能量石。
样例2:
输入:
energyStones = [10, 20, 10, 30, 20, 40, 40]输出:30解释:能量值 10、20、40 都出现了两次,只有 30 出现一次,因此 30 是独特的能量石。
样例3:
输入:
energyStones = [0, 1, 1, 2, 2, 3, 3]输出:0解释:能量值 1、2、3 都出现了两次,只有 0 出现一次,因此 0 是独特的能量石。
样例4:
输入:
energyStones = [5]输出:5解释:只有一个能量石,因此 5 就是独特的能量石。
约束条件
- 1 ≤ energyStones.length ≤ 1001
- 0 ≤ energyStonesi ≤ 1000
- 能量石的数量为奇数
- 除了一个能量值只出现一次外,其余每个能量值都恰好出现两次
程序代码
#include <stdio.h>
int findUnique(int* energyStones, int energyStonesSize) {
int result = 0;
for (int i = 0; i < energyStonesSize; i++) {
result ^= energyStonesi;
}
return result;
}
int main() {
int test1\[\] = {5, 3, 5, 2, 3, 8, 8};
int test2\[\] = {10, 20, 10, 30, 20, 40, 40};
int test3\[\] = {0, 1, 1, 2, 2, 3, 3};
int test4\[\] = {5};
printf("%d\n", findUnique(test1, 7)); // 2
printf("%d\n", findUnique(test2, 7)); // 30
printf("%d\n", findUnique(test3, 7)); // 0
printf("%d\n", findUnique(test4, 1)); // 5
return 0;
}
cpp
#include <stdio.h>
int findUnique(int* energyStones, int energyStonesSize) {
int result = 0;
for (int i = 0; i < energyStonesSize; i++) {
result ^= energyStones[i];
}
return result;
}
int main() {
int test1[] = {5, 3, 5, 2, 3, 8, 8};
int test2[] = {10, 20, 10, 30, 20, 40, 40};
int test3[] = {0, 1, 1, 2, 2, 3, 3};
int test4[] = {5};
printf("%d\n", findUnique(test1, 7)); // 2
printf("%d\n", findUnique(test2, 7)); // 30
printf("%d\n", findUnique(test3, 7)); // 0
printf("%d\n", findUnique(test4, 1)); // 5
return 0;
}
运行结果
