问题描述
小M正在参加一个能力选择挑战赛,他面前有多个能量球,每个能量球上都有一个整数能量值。挑战规则是:所有的能量球都成对出现(即每个能量值恰好出现两次),但有一个能量球是独特的,它的能量值只出现一次。小M需要快速找出这个独特能量球的能量值,才能通过挑战。
要求:
- 设计一个算法,在 O(n) 的时间复杂度内找出独特的能量值,其中 n 是能量球的数量。
- 尽量减少额外空间的使用,以展示你的算法优化技巧。
测试样例
样例1:
输入:
energy = [5, 3, 5, 2, 3, 1, 1]输出:2解释:能量值 2 只出现一次,是独特的能量球。
样例2:
输入:
energy = [10, 20, 10, 30, 20, 40, 40]输出:30解释:30 是唯一一个不重复的能量值。
样例3:
输入:
energy = [0, 1, 1, 2, 2, 3, 3]输出:0解释:0 只出现一次,其余能量值都成对出现。
约束条件
- 1 ≤ energy.length ≤ 1001
- 0 ≤ energy[i] ≤ 1000
- 能量球的数量为奇数
- 除了一个能量值只出现一次外,其余每个能量值都恰好出现两次
程序代码
#include <stdio.h>
int findUnique(int* energy, int energySize) {
int result = 0;
for (int i = 0; i < energySize; i++) {
result ^= energy[i];
}
return result;
}
int main() {
int energy1[] = {5, 3, 5, 2, 3, 1, 1};
int energy2[] = {10, 20, 10, 30, 20, 40, 40};
int energy3[] = {0, 1, 1, 2, 2, 3, 3};
printf("%d\n", findUnique(energy1, 7)); // 2
printf("%d\n", findUnique(energy2, 7)); // 30
printf("%d\n", findUnique(energy3, 7)); // 0
return 0;
}
#include <stdio.h> int findUnique(int* energy, int energySize) { int result = 0; for (int i = 0; i < energySize; i++) { result ^= energy[i]; } return result; } int main() { int energy1[] = {5, 3, 5, 2, 3, 1, 1}; int energy2[] = {10, 20, 10, 30, 20, 40, 40}; int energy3[] = {0, 1, 1, 2, 2, 3, 3}; printf("%d\n", findUnique(energy1, 7)); // 2 printf("%d\n", findUnique(energy2, 7)); // 30 printf("%d\n", findUnique(energy3, 7)); // 0 return 0; }