问题描述
小明最近沉迷于一个奇妙的货币交易游戏。游戏中有多种不同面值的货币,但有趣的是,除了某一种特殊货币外,每种货币都恰好有两枚相同的。小明需要快速找出那枚独一无二的货币面值,以便完成交易任务。
要求:
- 设计一个算法,在 O(n) 时间复杂度内找出唯一不重复的货币面值
- 只能使用 O(1) 的额外空间复杂度(即常数空间)
- 提示:考虑使用位运算的特性来优化解决方案
测试样例
样例1:
输入:
coins = [5, 10, 5, 10, 20, 30, 30]输出:20解释:面值 5、10、30 都出现了两次,只有面值 20 出现了一次。
样例2:
输入:
coins = [1, 2, 1, 2, 3, 3, 4]输出:4解释:面值 1、2、3 都出现了两次,只有面值 4 出现了一次。
样例3:
输入:
coins = [100, 200, 100, 300, 200]输出:300解释:面值 100、200 都出现了两次,只有面值 300 出现了一次。
约束条件
- 1 ≤ coins.length ≤ 1001
- 0 ≤ coinsi ≤ 1000
- 货币数量为奇数(保证为 2k+1 的形式)
- 除了一个货币面值只出现一次外,其余每个面值都恰好出现两次
- 必须使用 O(n) 时间复杂度和 O(1) 空间复杂度的算法
程序代码
#include <stdio.h>
int findUnique(int* coins, int coinsSize) {
int result = 0;
for (int i = 0; i < coinsSize; i++) {
result ^= coinsi;
}
return result;
}
int main() {
int coins1\[\] = {5, 10, 5, 10, 20, 30, 30};
int coins2\[\] = {1, 2, 1, 2, 3, 3, 4};
int coins3\[\] = {100, 200, 100, 300, 200};
printf("%d\n", findUnique(coins1, 7)); // 20
printf("%d\n", findUnique(coins2, 7)); // 4
printf("%d\n", findUnique(coins3, 5)); // 300
return 0;
}
cpp
#include <stdio.h>
int findUnique(int* coins, int coinsSize) {
int result = 0;
for (int i = 0; i < coinsSize; i++) {
result ^= coins[i];
}
return result;
}
int main() {
int coins1[] = {5, 10, 5, 10, 20, 30, 30};
int coins2[] = {1, 2, 1, 2, 3, 3, 4};
int coins3[] = {100, 200, 100, 300, 200};
printf("%d\n", findUnique(coins1, 7)); // 20
printf("%d\n", findUnique(coins2, 7)); // 4
printf("%d\n", findUnique(coins3, 5)); // 300
return 0;
}
运行结果
