问题描述
班级里举办了一场糖葫芦派对,每位同学都拿到了一串糖葫芦,每串糖葫芦上插着数量不同的山楂果(用整数表示)。已知班级中除了一个同学的糖葫芦串上的山楂果数量是独一无二的外,其他所有同学的糖葫芦串上的山楂果数量都恰好出现两次(即每个数量都恰好有两位同学相同)。班长小C想要快速找出那位拿着独一无二糖葫芦串的同学,以便为他颁发"最特别糖葫芦奖"。
要求:
- 设计一个算法,在 O(n) 时间内找出独一无二的糖葫芦串上的山楂果数量,其中 n 是班级人数。
- 尽量减少额外空间的使用,以体现你的算法优化能力。
测试样例
样例1:
输入:
candiedFruits = [3, 5, 3, 2, 5, 4, 2]输出:4解释:数字 3 出现两次(索引0和2),5 出现两次(索引1和4),2 出现两次(索引3和6),只有数字 4 出现一次(索引5),因此独一无二的糖葫芦串是 4。
样例2:
输入:
candiedFruits = [1, 2, 1, 2, 3, 3, 7]输出:7解释:数字 1 出现两次(索引0和2),2 出现两次(索引1和3),3 出现两次(索引4和5),只有数字 7 出现一次(索引6),因此独一无二的糖葫芦串是 7。
样例3:
输入:
candiedFruits = [0, 0, 1, 1, 2, 2, 8, 8, 9]输出:9解释:数字 0 出现两次(索引0和1),1 出现两次(索引2和3),2 出现两次(索引4和5),8 出现两次(索引6和7),只有数字 9 出现一次(索引8),因此独一无二的糖葫芦串是 9。
约束条件
- 1 ≤ candiedFruits.length ≤ 1001
- 0 ≤ candiedFruitsi ≤ 1000
- 班级人数为奇数(即数组长度为奇数)
- 除了一个糖葫芦串的山楂果数量只出现一次外,其余每个数量都恰好出现两次
程序代码
#include <stdio.h>
int findUnique(int* candiedFruits, int candiedFruitsSize) {
int result = 0;
for (int i = 0; i < candiedFruitsSize; i++) {
result ^= candiedFruitsi;
}
return result;
}
int main() {
int test1\[\] = {3, 5, 3, 2, 5, 4, 2};
int test2\[\] = {1, 2, 1, 2, 3, 3, 7};
int test3\[\] = {0, 0, 1, 1, 2, 2, 8, 8, 9};
printf("%d\n", findUnique(test1, 7)); // 4
printf("%d\n", findUnique(test2, 7)); // 7
printf("%d\n", findUnique(test3, 9)); // 9
return 0;
}
cpp
#include <stdio.h>
int findUnique(int* candiedFruits, int candiedFruitsSize) {
int result = 0;
for (int i = 0; i < candiedFruitsSize; i++) {
result ^= candiedFruits[i];
}
return result;
}
int main() {
int test1[] = {3, 5, 3, 2, 5, 4, 2};
int test2[] = {1, 2, 1, 2, 3, 3, 7};
int test3[] = {0, 0, 1, 1, 2, 2, 8, 8, 9};
printf("%d\n", findUnique(test1, 7)); // 4
printf("%d\n", findUnique(test2, 7)); // 7
printf("%d\n", findUnique(test3, 9)); // 9
return 0;
}
运行结果
