问题描述
小明和小红正在玩飞行棋,他们需要将棋子按照颜色分组。有趣的是,除了一个棋子之外,所有其他颜色的棋子都恰好有两个。由于小红不小心把一个棋子混入了另一组,现在需要你帮助小明快速找出那个颜色独特的棋子是什么颜色(用数字表示颜色)。
要求:
- 设计一个算法,使其时间复杂度为 O(n),其中 n 是棋子的总数。
- 尽量减少额外空间的使用,以体现你的算法优化能力。
测试样例
样例1:
输入:
pieces = [1, 1, 2, 2, 3, 3, 4, 5, 5]输出:4解释:颜色为 4 的棋子是唯一一个没有配对的。
样例2:
输入:
pieces = [0, 1, 0, 1, 2]输出:2解释:颜色 2 的棋子只出现一次,是独特的颜色。
样例3:
输入:
pieces = [7, 3, 3, 7, 10]输出:10解释:颜色 10 的棋子是唯一一个不重复的棋子颜色。
约束条件
- 1 ≤ pieces.length ≤ 1001
- 0 ≤ piecesi ≤ 1000
- 棋子总数为奇数
- 除了一个颜色的棋子只出现一次外,其余每个颜色的棋子都恰好出现两次
程序代码
#include <stdio.h>
int findUnique(int* pieces, int piecesSize) {
int result = 0;
for (int i = 0; i < piecesSize; i++) {
result ^= piecesi;
}
return result;
}
int main() {
int pieces1\[\] = {1, 1, 2, 2, 3, 3, 4, 5, 5};
int pieces2\[\] = {0, 1, 0, 1, 2};
int pieces3\[\] = {7, 3, 3, 7, 10};
printf("%d\n", findUnique(pieces1, 9)); // 4
printf("%d\n", findUnique(pieces2, 5)); // 2
printf("%d\n", findUnique(pieces3, 5)); // 10
return 0;
}
cpp
#include <stdio.h>
int findUnique(int* pieces, int piecesSize) {
int result = 0;
for (int i = 0; i < piecesSize; i++) {
result ^= pieces[i];
}
return result;
}
int main() {
int pieces1[] = {1, 1, 2, 2, 3, 3, 4, 5, 5};
int pieces2[] = {0, 1, 0, 1, 2};
int pieces3[] = {7, 3, 3, 7, 10};
printf("%d\n", findUnique(pieces1, 9)); // 4
printf("%d\n", findUnique(pieces2, 5)); // 2
printf("%d\n", findUnique(pieces3, 5)); // 10
return 0;
}
运行结果
