问题描述
小M最近沉迷于《光明之魂》这款游戏,他正在进行速通挑战。游戏中有多个关卡,每个关卡都有一个初始能量值。有趣的是,除了一个关卡的初始能量值之外,所有其他关卡的初始能量值都恰好出现了两次。小M需要快速找到那个拥有独特初始能量值的关卡,以便优先突破,完成速通挑战。
要求:
- 设计一个算法,在时间复杂度为 O(n) 内找到独特的初始能量值,其中 n 是关卡的数量。
- 尽量减少额外空间的使用,以优化算法的性能。
测试样例
样例1:
输入:
energies = [3, 5, 3, 5, 7, 9, 9]输出:7解释:初始能量值 3、5、9 都出现了两次,只有 7 出现了一次,因此 7 是独特的关卡。
样例2:
输入:
energies = [10, 20, 10, 30, 20, 40, 40]输出:30解释:初始能量值 10、20、40 都出现了两次,只有 30 出现了一次,因此 30 是独特的关卡。
样例3:
输入:
energies = [1, 2, 1, 2, 3, 4, 4, 5, 5]输出:3解释:初始能量值 1、2、4、5 都出现了两次,只有 3 出现了一次,因此 3 是独特的关卡。
约束条件
- 1 ≤ energies.length ≤ 1001
- 0 ≤ energiesi ≤ 1000
- 关卡数量(即数组长度)为奇数
- 除了一个初始能量值只出现一次外,其余每个初始能量值都恰好出现两次
程序代码
#include <stdio.h>
int findUnique(int* energies, int energiesSize) {
int result = 0;
for (int i = 0; i < energiesSize; i++) {
result ^= energiesi;
}
return result;
}
int main() {
int energies1\[\] = {3, 5, 3, 5, 7, 9, 9};
int energies2\[\] = {10, 20, 10, 30, 20, 40, 40};
int energies3\[\] = {1, 2, 1, 2, 3, 4, 4, 5, 5};
int size1 = sizeof(energies1) / sizeof(energies10);
int size2 = sizeof(energies2) / sizeof(energies20);
int size3 = sizeof(energies3) / sizeof(energies30);
printf("%d\n", findUnique(energies1, size1)); // 7
printf("%d\n", findUnique(energies2, size2)); // 30
printf("%d\n", findUnique(energies3, size3)); // 3
return 0;
}
cpp
#include <stdio.h>
int findUnique(int* energies, int energiesSize) {
int result = 0;
for (int i = 0; i < energiesSize; i++) {
result ^= energies[i];
}
return result;
}
int main() {
int energies1[] = {3, 5, 3, 5, 7, 9, 9};
int energies2[] = {10, 20, 10, 30, 20, 40, 40};
int energies3[] = {1, 2, 1, 2, 3, 4, 4, 5, 5};
int size1 = sizeof(energies1) / sizeof(energies1[0]);
int size2 = sizeof(energies2) / sizeof(energies2[0]);
int size3 = sizeof(energies3) / sizeof(energies3[0]);
printf("%d\n", findUnique(energies1, size1)); // 7
printf("%d\n", findUnique(energies2, size2)); // 30
printf("%d\n", findUnique(energies3, size3)); // 3
return 0;
}
运行结果
