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

运行结果

相关推荐
橘子汽水1681 小时前
Leetcode 763,45 划分字母区间 跳跃游戏II
数据结构·算法·leetcode
kiracrimson1 小时前
建堆的两种算法:O(N) 和 O(N log N) 差在哪里
数据结构
天天喝旺仔2 小时前
Git 内部原理深度解析:从 blob/tree/commit 对象到 packfile 与垃圾回收
数据结构·数据库·git·算法·哈希
Edward The Bunny2 小时前
Leetcode Hot 100
数据结构·算法
xiangyun6114 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun6114 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
OKkankan15 小时前
LangChain 能力详解!:输出解析、RAG、向量数据库与 Retriever 检索器
数据结构·python·langchain·ai应用
蓝速科技15 小时前
便民服务大厅 AI 数字人一体机场景适配与落地指南丨蓝速科技
大数据·网络·数据结构·人工智能·自然语言处理·数据分析·运维开发
xxwxx__16 小时前
C++ AVL 树深度剖析:平衡二叉搜索树原理、源码与面试考点
数据结构·c++