文章目录
一、题目要求
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
二、解题思路
位操作:异或
- 异或运算符”^”。
- 若参加运算的两个二进位同号,则结果为0(假);异号则为1(真)。
- 即 0 ^ 0=0,0 ^ 1=1, 1 ^ 0=1,1 ^ 1=0。
运算 | 解释 |
---|---|
0 ^ 0 = 0, 0 ^ 1 = 1 | 0 异或其他任何数 = 任何数 |
1 ^ 0 = 1, 1 ^ 1 = 0 | 1 异或其他任何数 = 任何数取反 |
a ^ a = 0 | 任何数异或任何数 = 0 |
a ^ b ^ c = a ^ c ^ b | 异或运算符合交换律 |
(a ^ b) ^ c = a ^ ( b ^c ) | 异或运算符合结合律 |
- 根据以上异或性质,我们只需要创建一个初始值为 0 的变量,并用这个变量不断与数组中每一个值相互异或
- 由于数组中只有一个数值是单个存在的,其他都有两个相同的数值
- 因此,该题的数组运算可表示为
- a ^ a ^ b ^ b ^ c … = 0 ^ 0 ^ c
- 则最后留下来的数值即为单个存在的数值
代码如下:
class Solution
{
public:
int singleNumber(vector<int>& nums)
{
// 创建一个结果变量 result 为 0;
int result = 0;
// 遍历 nums 数组中的每一个元素, 并将其赋值给 e
for (auto e : nums)
// 每次将 result 与 e 相异或
result ^= e;
return result;
}
};