给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
在这里必须先明白 异或运算符(^)的使用方法:1^1=0 0^0=0 只有 1^0=1 这个最基本的原理
现在来解释一下这个算法运用的原理:0 ^ 任何数 = 任何数 ,对同一个数异或两次 结果不变
题干中明确说明了,只有有一个数只出现一次,其余均出现两次,刚好满足上面的原理,假如说其他元素也有可能出现奇数次,那么这个方法就不成立了,其他数字必须出现偶数次,而目标数字出现奇数次才可以用这个方法
我先举个简单的栗子:如果要你交换两个数,不能使用额外的内存空间,你会怎么做?
这里就可以使用异或运算符了,具体步骤是这样的
a=a^b
b=a^b // b=a^b^b=a
a=a^b // a=a^b^a 这里最后的a就 b来的,因为上一步已经把 a 赋值给了b
现在来看我们这道题:show code
class Solution {
public:
int singleNumber(vector<int>& nums) {
int len = nums.size();
int res = 0; // 初始值为零,不管异或任何数都等于任何数
for(int i=0;i<len;i++)
{
res = res^nums[i]; // 同一个数异或两次就抵消掉了,到最后只剩下那个出现一次的数
}
return res;
}
};
思想新颖,自己也是刷题看到的,记录一下