问题描述
小明是一名游戏设计师,他正在设计一款英雄升级系统。游戏中,英雄每完成一个任务会获得一定数量的经验值奖励(用整数表示)。有趣的是,除了一个特殊任务外,其他所有任务给出的经验值奖励都恰好出现了两次。这个特殊任务会给出独特的经验值奖励,帮助英雄快速升级。
现在需要你帮助小明快速找出这个独特经验值奖励是多少,以便他调整游戏平衡性。
要求:
- 设计一个算法,使其时间复杂度为 O(n),其中 n 是任务的数量。
- 尽量减少额外空间的使用,以体现你的算法优化能力。
测试样例
样例1:
输入:
rewards = [50, 50, 100, 100, 200, 200, 300, 500, 500]输出:300解释:300 经验值的奖励是唯一没有重复出现的。
样例2:
输入:
rewards = [0, 5, 0, 5, 10]输出:10解释:10 经验值的奖励只出现一次,是独特的任务奖励。
样例3:
输入:
rewards = [80, 30, 30, 80, 150]输出:150解释:150 是奖励列表中唯一不重复的经验值。
约束条件
- 1 ≤ rewards.length ≤ 1001
- 0 ≤ rewardsi ≤ 1000
- 任务数量为奇数
- 除了一个经验值奖励只出现一次外,其余每个经验值奖励都恰好出现两次
程序代码
#include <stdio.h>
int findUnique(int* rewards, int rewardsSize) {
int result = 0;
for (int i = 0; i < rewardsSize; i++) {
result ^= rewardsi;
}
return result;
}
int main() {
int rewards1\[\] = {50, 50, 100, 100, 200, 200, 300, 500, 500};
int rewards2\[\] = {0, 5, 0, 5, 10};
int rewards3\[\] = {80, 30, 30, 80, 150};
int size1 = sizeof(rewards1) / sizeof(rewards10);
int size2 = sizeof(rewards2) / sizeof(rewards20);
int size3 = sizeof(rewards3) / sizeof(rewards30);
printf("%d\n", findUnique(rewards1, size1)); // 300
printf("%d\n", findUnique(rewards2, size2)); // 10
printf("%d\n", findUnique(rewards3, size3)); // 150
return 0;
}
cpp
#include <stdio.h>
int findUnique(int* rewards, int rewardsSize) {
int result = 0;
for (int i = 0; i < rewardsSize; i++) {
result ^= rewards[i];
}
return result;
}
int main() {
int rewards1[] = {50, 50, 100, 100, 200, 200, 300, 500, 500};
int rewards2[] = {0, 5, 0, 5, 10};
int rewards3[] = {80, 30, 30, 80, 150};
int size1 = sizeof(rewards1) / sizeof(rewards1[0]);
int size2 = sizeof(rewards2) / sizeof(rewards2[0]);
int size3 = sizeof(rewards3) / sizeof(rewards3[0]);
printf("%d\n", findUnique(rewards1, size1)); // 300
printf("%d\n", findUnique(rewards2, size2)); // 10
printf("%d\n", findUnique(rewards3, size3)); // 150
return 0;
}
运行结果
