问题描述
在数学节的艺术展上,小C的班级设计了一个螺旋阵列图案,每个同学站在阵列的一个格子里,手中举着一个整数卡片。这个阵列的神奇之处在于,除了一个同学手中的数字是独一无二的"艺术核心"外,其他所有数字都成对出现,形成对称的美感。为了完成展览,小C需要快速找出那个手持独特数字的同学的位置(即找出那个只出现一次的数字的索引位置)。
要求:
- 设计一个算法,在时间复杂度 O(n) 内找到独特数字的索引位置,其中 n 是阵列中的数字数量。
- 尽量减少额外空间的使用,以展示算法的优雅和效率。
测试样例
样例1:
输入:
array = [5, 3, 5, 2, 2, 1, 1]输出:1解释:数字 3 在索引位置 1 处只出现一次,是螺旋阵列中的艺术核心。
样例2:
输入:
array = [4, 4, 6, 6, 8, 9, 9]输出:4解释:数字 8 在索引位置 4 处是唯一不重复的数字,代表独特的艺术点。
样例3:
输入:
array = [10, 20, 10, 20, 30]输出:4解释:数字 30 在索引位置 4 处只出现一次,标识了艺术核心的位置。
约束条件
- 1 ≤ array.length ≤ 1001
- 0 ≤ arrayi ≤ 1000
- 阵列长度(即数字数量)为奇数
- 除了一个数字只出现一次外,其余每个数字都恰好出现两次
- 数组中的数字排列满足:成对出现的数字要么都在独特数字之前,要么都在独特数字之后,但成对数字本身不一定相邻(即数组未排序)
程序代码
#include <stdio.h>
int findUniqueIndex(int* array, int arraySize) {
// 第一步:异或找出独特数字
int unique = 0;
for (int i = 0; i < arraySize; i++) {
unique ^= arrayi;
}
// 第二步:找到独特数字的索引
for (int i = 0; i < arraySize; i++) {
if (arrayi == unique) {
return i;
}
}
return -1;
}
int main() {
int array1\[\] = {5, 3, 5, 2, 2, 1, 1};
int array2\[\] = {4, 4, 6, 6, 8, 9, 9};
int array3\[\] = {10, 20, 10, 20, 30};
printf("%d\n", findUniqueIndex(array1, 7)); // 1
printf("%d\n", findUniqueIndex(array2, 7)); // 4
printf("%d\n", findUniqueIndex(array3, 5)); // 4
return 0;
}
cpp
#include <stdio.h>
int findUniqueIndex(int* array, int arraySize) {
// 第一步:异或找出独特数字
int unique = 0;
for (int i = 0; i < arraySize; i++) {
unique ^= array[i];
}
// 第二步:找到独特数字的索引
for (int i = 0; i < arraySize; i++) {
if (array[i] == unique) {
return i;
}
}
return -1;
}
int main() {
int array1[] = {5, 3, 5, 2, 2, 1, 1};
int array2[] = {4, 4, 6, 6, 8, 9, 9};
int array3[] = {10, 20, 10, 20, 30};
printf("%d\n", findUniqueIndex(array1, 7)); // 1
printf("%d\n", findUniqueIndex(array2, 7)); // 4
printf("%d\n", findUniqueIndex(array3, 5)); // 4
return 0;
}
运行结果
