力扣 136.只出现一次的数字
一、题目
给你一个 非空 整数数组 nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 :
输入:nums = [2,2,1]
输出:1
示例 2 :
输入:nums = [4,1,2,1,2]
输出:4
示例 3 :
输入:nums = [1]
输出:1
二、解题思路
问题分析:
- 数组中除一个元素只出现一次外,其余元素均出现两次
- 要求:线性时间复杂度(O (n))和常量空间复杂度(O (1))
关键发现:
- 异或(XOR)运算的特殊性质:
- 任何数与自身异或结果为 0(例如:5 ^ 5 = 0)
- 任何数与 0 异或结果为自身(例如:5 ^ 0 = 5)
- 异或运算具有交换律和结合律(顺序不影响结果)
- 异或(XOR)运算的特殊性质:
解题步骤:
- 初始化一个变量(如
result
)为 0 - 遍历数组中的每个元素,依次与
result
进行异或运算 - 最终
result
的值就是只出现一次的元素 - 原理:出现两次的元素会相互抵消(结果为 0),最后剩下的就是唯一出现一次的元素
- 初始化一个变量(如
三、代码
int singleNumber(int* nums, int numsSize) {int result = 0;// 遍历数组,将所有元素进行异或运算for (int i = 0; i < numsSize; i++) {result ^= nums[i];}return result;
}
四、总结
算法优势:
- 时间复杂度:O (n),只需遍历一次数组
- 空间复杂度:O (1),仅使用一个额外变量
- 无需排序或哈希表等辅助结构,效率极高
核心原理:
- 利用异或运算的特性,将所有元素依次异或
- 成对出现的元素会相互抵消(结果为 0)
- 最终结果自然就是那个只出现一次的元素