问题描述
小M最近买了一个新书柜,书柜有若干层,每层有一个独特的编号(但不同层的编号可能相同)。有趣的是,除了某一层的编号只出现一次外,其他每个编号都恰好出现在两层书柜上(即每个编号都恰好出现两次)。小M想知道,那个编号只出现一次的书柜是哪一层?
要求:
- 设计一个算法,在时间复杂度 O(n) 内找出那个独特的书柜编号,其中 n 是书柜的层数。
- 尽量减少额外空间的使用,以体现算法优化能力。
测试样例
样例1:
输入:
shelves = [3, 5, 3, 2, 5, 4, 2]输出:4解释:编号4出现1次,编号3、5、2各出现2次,所以独特编号是4。
样例2:
输入:
shelves = [10, 20, 10, 30, 20, 40, 40]输出:30解释:编号30出现1次,编号10、20、40各出现2次,所以独特编号是30。
样例3:
输入:
shelves = [1, 1, 2, 2, 3, 3, 4, 4, 5]输出:5解释:编号5出现1次,编号1、2、3、4各出现2次,所以独特编号是5。
约束条件
- 1 ≤ shelves.length ≤ 1001
- 0 ≤ shelvesi ≤ 1000
- 书柜层数为奇数
- 除了一个书柜编号只出现一次外,其余每个书柜编号都恰好出现两次
程序代码
#include <stdio.h>
int findUnique(int* shelves, int shelvesSize) {
int result = 0;
for (int i = 0; i < shelvesSize; i++) {
result ^= shelvesi;
}
return result;
}
int main() {
int shelves1\[\] = {3, 5, 3, 2, 5, 4, 2};
int shelves2\[\] = {10, 20, 10, 30, 20, 40, 40};
int shelves3\[\] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
printf("%d\n", findUnique(shelves1, 7)); // 4
printf("%d\n", findUnique(shelves2, 7)); // 30
printf("%d\n", findUnique(shelves3, 9)); // 5
return 0;
}
cpp
#include <stdio.h>
int findUnique(int* shelves, int shelvesSize) {
int result = 0;
for (int i = 0; i < shelvesSize; i++) {
result ^= shelves[i];
}
return result;
}
int main() {
int shelves1[] = {3, 5, 3, 2, 5, 4, 2};
int shelves2[] = {10, 20, 10, 30, 20, 40, 40};
int shelves3[] = {1, 1, 2, 2, 3, 3, 4, 4, 5};
printf("%d\n", findUnique(shelves1, 7)); // 4
printf("%d\n", findUnique(shelves2, 7)); // 30
printf("%d\n", findUnique(shelves3, 9)); // 5
return 0;
}
运行结果
