一、力扣136. 只出现一次的数字
(一)排序
思路:由于题目说是只有一个元素会出现一次,其余元素均会出现两次,因此我们将这个数组排序,找出落单的一个元素就是我们所要找的只出现一次的元素。
代码:
class Solution
{
public:
int singleNumber(vector<int>& nums)
{
sort(nums.begin(),nums.end());
int i=0;
while(i+1<nums.size())
{
if(nums[i]!=nums[i+1])
{
return nums[i];
}
else
{
i+=2;
}
}
return nums[i];
}
};
(二)哈希表
思路:将每个元素出现的次数统计在哈希表中,然后遍历一遍哈希表,找出只出现一次的元素
代码如下:
class Solution
{
public:
int singleNumber(vector<int>& nums)
{
unordered_map<int,int> hash;
for(int i=0;i<nums.size();i++)
{
hash[nums[i]]++;
}
for(auto&x:hash)
{
if(x.second==1)
{
return x.first;
}
}
return -1;
}
};
(三)位运算
思路:由于只有一个数字出现了一次,其余数字都出现了两次,而位运算的异或运算的特点是只有相同位置上的值不同时才为真,所以对数组中的元素分别与0进行异或(任何数与0异或的结果都是这个数,任何数和自己异或都是0),所以最终返回该数组中所有元素异或的结果即可
代码如下:
class Solution
{
public:
int singleNumber(vector<int>& nums)
{
int res=0;
for(auto & x:nums)
{
res^=x;
}
return res;
}
};
二、力扣137. 只出现一次的数字II
(一)哈希表法
思路比较简单也很好理解,直接看代码
代码如下:
class Solution
{
public:
int singleNumber(vector<int>& nums)
{
unordered_map<int,int>hash;
for(int i=0;i<nums.size();i++)
{
hash[nums[i]]++;
}
for(auto&x:hash)
{
if(x.second==1)
{
return x.first;
}
}
return -1;
}
};
三、力扣260. 只出现一次的数字III
(一)哈希表法
代码如下:
class Solution
{
public:
vector<int> singleNumber(vector<int>& nums)
{
unordered_map<int,int>hash;
vector<int>res;
for(int i=0;i<nums.size();i++)
{
hash[nums[i]]++;
}
for(auto &x:hash)
{
if(x.second==1)
{
res.push_back(x.first);
}
}
return res;
}
};
✨✨✨