目录
题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
我的方法
思路
题目要求线性时间复杂度,说明一次遍历就应该能够找到这个元素了。题目中明确表明除了这个单一元素外,其它元素均出现两次,那么如果其它元素两两抵消,那么最终剩下的元素不就是这个单一元素了嘛!怎样才能让相同的元素两两抵消呢?位运算异或操作----相当于不带进位的二进制加法!比如2 XOR 2 = 0, 1 XOR 2 = 3,这样相同的元素两两异或变为0,然后0异或这个单一元素,结果就是这个单一元素的值。
代码
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ret = nums[0]; // 题目中设定了数组不为空,所以这里不用判断溢出
for(int i = 1; i != nums.size(); ++i)
ret ^= nums[i];
return ret;
}
};