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

运行结果

相关推荐
1-1=01 小时前
C# 数据结构和特殊类型
数据结构·c#·.net·.netcore
希和20271 小时前
C语言程序设计题|有序数组插入数字冒泡排序
c语言·数据结构·算法
布莱克60512 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
D e re k ZH14 小时前
C++ 系统学习手记:从语法细节到工程实践
开发语言·数据结构·c++·算法
Zwawa16 小时前
屏幕不止一种:OLED、LCD1602字符屏、TFT/IPS图形屏和串口屏怎么用,这与TTY和PTY又有什么关系
c语言·单片机·嵌入式
Fruiticecake16 小时前
C 程序员速通现代 C++(一):lambda、std::function、移动语义与智能指针
c语言·c++
田甲17 小时前
做一款 Type-C 母座读卡器:GL3224 双卡方案实测
c语言·开发语言
zh_xuan20 小时前
LeeCode 496. 下一个更大元素I
数据结构·算法·栈·单调栈
·present·21 小时前
CSAPP(lecture 13_02 Linking)
c语言·c++
白杨尚青1 天前
C++进阶篇(五):红黑树——四条规则、三种插入情况与旋转变色
开发语言·数据结构·c++·stl·红黑树·平衡二叉树