一个数组中除了一个数字其他的都是出现两次,请找出这个数字。
1、0(n)时间和空间复杂度
用到了hash。
创建一个set数组,依次扫描所给数组,若跟set里面数重复则不是,且从set里删除这个数,若不重复则加入set,最后留在set里面的那个数就是所需的数字。
set不存重复的key值;
class Solution {
public:
int singleNumber(vector<int>& nums) {
set<int> hash;
hash.insert(nums[0]);
int n=nums.size();
while(true){
if(nums.size()==1)
return nums[0];
int i=1;
while(i<n){
if(hash.find(nums[i])==hash.end())
{ hash.insert(nums[i]);
i++;
}
else
{
hash.erase(nums[i]);
i++;
}
}
return *hash.begin();
}
}
};
2、O(n)时间复杂度,O(1)空间复杂度
位运算
异或运算
//2^1^3^1^2^3^5=(2^2)^(1^1)^(3^3)^5=0^0^0^5=5
class Solution {
public:
int singleNumber(vector<int>& nums) {
int n=nums.size();
int result=0;
for(int i=0;i<n;i++){
result ^= num[i];
}
return result;
}
};