C语言/数据结构位运算题解:异或XOR找出星球探险中的“独特能量石“——只出现一次的数字

问题描述

小M是一位勇敢的太空探险家,他在探索一颗神秘星球时发现了一串奇特的能量石序列。这些能量石上刻有不同的整数能量值,但奇怪的是,除了一个能量石的能量值之外,其他所有能量值都恰好出现了两次。传说中,那个独特的能量石是打开星球宝藏的关键!小M需要你的帮助,快速找出那个独特能量石的能量值,以便继续他的冒险。

要求:

  1. 设计一个算法,在 O(n) 的时间复杂度内找出只出现一次的能量值,其中 n 是能量石的数量。
  2. 尽量减少额外空间的使用,以展现你的算法优化技巧。

测试样例

样例1:

输入:energyStones = [5, 3, 5, 2, 3, 8, 8] 输出:2 解释:能量值 5、3、8 都出现了两次,只有 2 出现一次,因此 2 是独特的能量石。

样例2:

输入:energyStones = [10, 20, 10, 30, 20, 40, 40] 输出:30 解释:能量值 10、20、40 都出现了两次,只有 30 出现一次,因此 30 是独特的能量石。

样例3:

输入:energyStones = [0, 1, 1, 2, 2, 3, 3] 输出:0 解释:能量值 1、2、3 都出现了两次,只有 0 出现一次,因此 0 是独特的能量石。

样例4:

输入:energyStones = [5] 输出:5 解释:只有一个能量石,因此 5 就是独特的能量石。

约束条件

  • 1 ≤ energyStones.length ≤ 1001
  • 0 ≤ energyStonesi ≤ 1000
  • 能量石的数量为奇数
  • 除了一个能量值只出现一次外,其余每个能量值都恰好出现两次

程序代码

#include <stdio.h>

int findUnique(int* energyStones, int energyStonesSize) {

int result = 0;

for (int i = 0; i < energyStonesSize; i++) {

result ^= energyStonesi;

}

return result;

}

int main() {

int test1\[\] = {5, 3, 5, 2, 3, 8, 8};

int test2\[\] = {10, 20, 10, 30, 20, 40, 40};

int test3\[\] = {0, 1, 1, 2, 2, 3, 3};

int test4\[\] = {5};

printf("%d\n", findUnique(test1, 7)); // 2

printf("%d\n", findUnique(test2, 7)); // 30

printf("%d\n", findUnique(test3, 7)); // 0

printf("%d\n", findUnique(test4, 1)); // 5

return 0;

}

cpp 复制代码
#include <stdio.h>

int findUnique(int* energyStones, int energyStonesSize) {
    int result = 0;
    for (int i = 0; i < energyStonesSize; i++) {
        result ^= energyStones[i];
    }
    return result;
}

int main() {
    int test1[] = {5, 3, 5, 2, 3, 8, 8};
    int test2[] = {10, 20, 10, 30, 20, 40, 40};
    int test3[] = {0, 1, 1, 2, 2, 3, 3};
    int test4[] = {5};
    
    printf("%d\n", findUnique(test1, 7));  // 2
    printf("%d\n", findUnique(test2, 7));  // 30
    printf("%d\n", findUnique(test3, 7));  // 0
    printf("%d\n", findUnique(test4, 1));  // 5
    
    return 0;
}

运行结果

相关推荐
quaer10 小时前
弗洛伊德算法--判圈法寻找环的入口O(n) O(1)
数据结构·算法
鱼很腾apoc13 小时前
【MySQL】第4期 用户管理与 C 语言连接编程详解
linux·服务器·c语言·mysql·connector/c
xys_67814 小时前
深挖数据结构:树和二叉树(上)
数据结构·算法
BeiGuTing_code14 小时前
Java动态数组(一)
java·数据结构·windows
himobrinehacken15 小时前
位运算揭秘:左右移与符号位陷阱
c语言·c++·算法·安全
Code_Solitude17 小时前
传智杯备赛代码整理(前4题)
数据结构·算法
水饺编程18 小时前
第2章:Linux 基础,rm 命令
linux·c语言·汇编
Jasmine_llq18 小时前
《P8816 [CSP-J 2022] 上升点列》
数据结构·算法·贪心·排序·二维动态规划 dp·类背包状态转移
夏虫不可与之言冰18 小时前
第三课 点亮 LED 与定时器非阻塞闪烁
c语言·c++·vscode·单片机·嵌入式硬件·物联网
辛苦才能18 小时前
C++ 哈希表深度解析:删除为什么必须打标记,负载因子为什么卡 0.7
开发语言·数据结构·c++·算法