题目再现
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现过两次,找出那个只出现过一次的元素。
说明
你的算法应该具有线性时间复杂度。你可以不使用额外的空间来实现么?
示例一
输入: [2,2,1]
输出: 1
代码1(我的代码)
class Solution {
public:
int singleNumber(vector<int>& nums) {
int p=nums.size();
sort(nums.begin(),nums.end());
if(nums.size()==1)
return nums[0];
for(int i=0;i<nums.size();i++){
if(i==0){
if(nums[i]!=nums[i+1]) return nums[i];
}
else if(i==nums.size()-1){
if(nums[i]!=nums[i-1]) return nums[i];
}
else{
if(nums[i]!=nums[i-1] && nums[i]!=nums[i+1])
return nums[i];
}
}
return 0;
}
};
我的代码运行速率:代码思想:
首先将数据进行排序,这样相同的数据就会挨在一起,只要当前数据i与前面和后面的都不同,那么这个数据就是独立的。第一个和最后一个数据只需要与后面的或者前面的数据进行比较。
代码2
class Solution {
public:
int singleNumber(vector<int>& nums) {
int p=0;
for(auto x:nums) p^=x;//用了异或
return p;
}
};
代码思想来自于LeeCode
这里使用了异或思想:
当两个相同的数据出现时,值为0:a⊕a=0
而:a1⊕a2⊕a1=(a1⊕a1)⊕a2=a2
所以式子可以整理为:
(a1⊕a1)⊕(a2⊕a2)⊕⋯⊕(am⊕am)⊕am+1=am+1