问题描述
小C今天带来了一堆美味的果子到班级分享,每个果子都有一个编号。同学们依次挑选果子,有趣的是,除了一个编号的果子之外,其他编号的果子都被挑选了恰好两次。小C想快速找出那个被挑选了奇数次的果子编号(也就是只被挑走一次的果子),以便确认剩下的果子是否分配均匀。
要求:
- 设计一个算法,在 O(n) 的时间复杂度内找出只出现一次的编号,其中 n 是挑选次数总数(即数组长度)。
- 尽量减少额外空间的使用,以体现算法的优化能力。
测试样例
样例1:
输入:
fruits = [5, 2, 3, 2, 5, 3, 7]输出:7解释:编号 5、2、3 都出现了两次,只有编号 7 出现了一次。
样例2:
输入:
fruits = [10, 10, 20, 30, 30]输出:20解释:编号 10 和 30 都出现了两次,只有编号 20 出现了一次。
样例3:
输入:
fruits = [1, 1, 2, 2, 3, 3, 4, 4, 99]输出:99解释:编号 1、2、3、4 都出现了两次,只有编号 99 出现了一次。
约束条件
- 1 ≤ fruits.length ≤ 1001(且数组长度必为奇数)
- 0 ≤ fruitsi ≤ 1000
- 除了一个编号只出现一次外,其余每个编号都恰好出现两次
程序代码
#include <stdio.h>
int findUniqueFruit(int* fruits, int fruitsSize) {
int result = 0;
for (int i = 0; i < fruitsSize; i++) {
result ^= fruitsi;
}
return result;
}
int main() {
int fruits1\[\] = {5, 2, 3, 2, 5, 3, 7};
int fruits2\[\] = {10, 10, 20, 30, 30};
int fruits3\[\] = {1, 1, 2, 2, 3, 3, 4, 4, 99};
printf("%d\n", findUniqueFruit(fruits1, 7)); // 7
printf("%d\n", findUniqueFruit(fruits2, 5)); // 20
printf("%d\n", findUniqueFruit(fruits3, 9)); // 99
return 0;
}
cpp
#include <stdio.h>
int findUniqueFruit(int* fruits, int fruitsSize) {
int result = 0;
for (int i = 0; i < fruitsSize; i++) {
result ^= fruits[i];
}
return result;
}
int main() {
int fruits1[] = {5, 2, 3, 2, 5, 3, 7};
int fruits2[] = {10, 10, 20, 30, 30};
int fruits3[] = {1, 1, 2, 2, 3, 3, 4, 4, 99};
printf("%d\n", findUniqueFruit(fruits1, 7)); // 7
printf("%d\n", findUniqueFruit(fruits2, 5)); // 20
printf("%d\n", findUniqueFruit(fruits3, 9)); // 99
return 0;
}
运行结果
