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

运行结果

相关推荐
Escalating_xu1 小时前
【C 语言】深入理解指针(3):字符指针、数组指针、二维数组传参、函数指针与转移表
java·c语言·开发语言
垆边人似月.1 小时前
华为机考题:最小代价爬楼梯
c语言·c++
垆边人似月.2 小时前
华为机考题:二叉树的最大路径和
c语言·c++
程序猿编码3 小时前
不用 PyTorch!纯 C 实现 N 维张量 + 反向传播,完成手写数字识别训练
c语言·人工智能·pytorch·神经网络·卷积神经网络·大模型推理
hnjzsyjyj3 小时前
洛谷 P1339:[USACO09OCT] Heat Wave G ← Bellman-Ford 算法
数据结构·bellman-ford 算法
Navigator_Z4 小时前
LeetCode //C - 1269. Number of Ways to Stay in the Same Place After Some Steps
c语言·算法·leetcode
垆边人似月.5 小时前
华为机考题:矩阵中的最长递增路径
c语言·c++
SelectDB技术团队5 小时前
ClickHouse 存日志的能力边界:并发、检索与 trace 回放的实测对照
数据结构·数据库·clickhouse·日志分析·apache doris·日志存储
垆边人似月.5 小时前
华为算法题:最长连续递增子序列的变
数据结构·算法·leetcode