C语言/数据结构位运算题解:异或XOR找出独特数字的索引位置——成对数字在两侧

问题描述

在数学节的艺术展上,小C的班级设计了一个螺旋阵列图案,每个同学站在阵列的一个格子里,手中举着一个整数卡片。这个阵列的神奇之处在于,除了一个同学手中的数字是独一无二的"艺术核心"外,其他所有数字都成对出现,形成对称的美感。为了完成展览,小C需要快速找出那个手持独特数字的同学的位置(即找出那个只出现一次的数字的索引位置)。

要求:

  1. 设计一个算法,在时间复杂度 O(n) 内找到独特数字的索引位置,其中 n 是阵列中的数字数量。
  2. 尽量减少额外空间的使用,以展示算法的优雅和效率。

测试样例

样例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;
}

运行结果

相关推荐
lhbweilai1 小时前
深挖FreeRTOS内核实现(三)
c语言·stm32·单片机
xxwl5851 小时前
数据结构知识点和代码实现总结(C语言实现)
c语言·开发语言·数据结构
小灰灰搞电子2 小时前
C语言 <time.h> 头文件详解
c语言·time.h
C++ 老炮儿的技术栈4 小时前
sizeof操作符
c语言·c++·人工智能·mfc·c
wuminyu4 小时前
ForkJoinPool内部WorkQueue的Lock-Free数组操作以及并发任务窃取原理剖析
java·linux·c语言·jvm·c++
她说彩礼65万4 小时前
C语言 堆区和栈区
java·linux·c语言
mokongJ6 小时前
17 份异构销售数据的合并清洗方案:30 万行处理耗时 9.64 秒
数据结构
小师兄吃牛肉6 小时前
C语言基本语法汇总
c语言
无忧.芙桃6 小时前
C++ 并查集详解:原理、实现与应用
c语言·c++·算法·leetcode
蛋蛋的就会顺顺的7 小时前
hot100——二叉树
java·数据结构·算法·leetcode·力扣