给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
排序之后如果一个元素后面跟他不同,则取出该元素
class Solution {
public:
int singleNumber(vector<int>& nums) {
sort(nums.begin(),nums.end());//C++快速排序库函数
// for(int i=0;i<nums.size();i++)
// {
// cout<<nums[i];
// }
int i=0;
for(i=1;i<nums.size();i++)
{
if(nums[i-1]!=nums[i])
break;
else
i++;
}
return nums[i-1];
}
};
双循环,如果内循环到底,即没有发现相同的,取出
class Solution {
public:
int singleNumber(vector<int>& nums) {
int len = nums.size();
int i=0;
for(i=0;i<len;i++)
{
int j=0;
for(j;j<len;j++)
{
if(j==i)
continue;
if(nums[i]==nums[j])
break;
}
if(j==len)
return nums[i];
}
return 0;
}
};
但是上两种简单算法不符合线性时间复杂度要求
线性时间复杂度要求的算法为
使用哈希表,c++中哈希表为unordered_map
遇见元素就把元素的key + 1
最后遍历哈希表找key为1的就可以了
class Solution {
public:
int singleNumber(vector<int>& nums) {
unordered_map<int,int> hashmap;
for (int c : nums)
{
if(hashmap[c])
++hashmap[c];
else{
hashmap[c] = 1;
}
}
for (auto it = hashmap.begin(); it!=hashmap.end(); ++it)
{
if(it->second == 1)
return it->first;
}
return 0;
}
};
直接异或
因为全是出现了两个,只有一个出现了一次,所以全部异或,最后那个就是出现一次的
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ret = 0;
for (auto e: nums) ret ^= e;
return ret;
}
};