欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > 136. 只出现一次的数字

136. 只出现一次的数字

2025/6/18 20:05:46 来源:https://blog.csdn.net/weixin_61695887/article/details/148674556  浏览:    关键词:136. 只出现一次的数字

目录

一、问题描述

二、解题思路

三、代码

四、复杂度分析


一、问题描述

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

二、解题思路

异或 XOR 的几个性质:

  1. a ^ a = 0(任何数和自己异或为0)

  2. a ^ 0 = a(任何数和0异或还是它本身)

  3. 异或满足 交换律结合律a ^ b ^ c = a ^ (b ^ c)

所以如果一个数组中:

  • 所有元素都出现 两次,只有一个元素出现 一次

  • 那么我们把数组里所有数字都异或一遍,成对的数会变成 0,最终结果就是那个 只出现一次的数

示例:

 

cpp

复制编辑

nums = [2, 3, 2, 3, 5]

这里:

  • 2 出现了两次

  • 3 出现了两次

  • 只有 5 出现了一次,结果应该返回 5


🚀 为什么用异或?

🔢 异或的核心特点:
操作结果含义
a ^ a0自己跟自己异或等于 0
a ^ 0a任何数与 0 异或还是它自己
异或满足 交换律结合律a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b顺序不重要


✅ 用异或解这道题的逻辑:

假设你从左到右,遍历 nums,把所有数都异或到一个变量 result 中。

由于所有数都出现两次,它们“配对异或”之后变成了 0只有那个“只出现一次”的数还剩下来!


🧮 举个完整例子:

nums = [4, 1, 2, 1, 2]

我们用异或来操作:

步骤当前数字异或结果 (result)
初始-0(初始值)
140 ^ 4 = 4
214 ^ 1 = 5
325 ^ 2 = 7
417 ^ 1 = 6
526 ^ 2 = 4

最后结果是 4,就是我们想找的答案!

三、代码

class Solution {
public:int singleNumber(vector<int>& nums) {int result = 0; // 初始结果设为 0// 遍历数组中的所有元素for (int num : nums) {result ^= num; // 把每个数和 result 做异或}return result; // 最后剩下的就是只出现一次的数}
};

四、复杂度分析

项目复杂度说明
⏱ 时间复杂度O(n)只遍历一次数组
🧠 空间复杂度O(1)只用一个整型变量 result

五、小结

  • 什么异或能解决这个问题?
    因为成对的数字会变成 0,只出现一次的那个数字会被留下。

  • 为什么时间是 O(n)?
    因为你只遍历了一次数组。

  • 为什么空间是 O(1)?
    只用了一个整型变量,不管数组多大。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词