解法一
排序
class Solution {
public:
int singleNumber(vector<int>& nums) {
sort(nums.begin(),nums.end());//排序
for (int i = 0; i < nums.size()-2; i+=3)//注意跳出循环条件
{
if(nums[i]!=nums[i+2]) return nums[i];//每隔三个数字检测一次
}
return nums.back();
}
};
解法二
hash map,资源消耗较大
//hash
class Solution {
public:
int singleNumber(vector<int>& nums) {
unordered_map<int,int> store;
for (int i = 0; i < nums.size(); i++)
{
store[nums[i]]++;
}
unordered_map<int,int>::const_iterator iter;
for(int i:nums){
iter=store.find(i);
if(iter->second ==1) return iter->first;
}
return -1;
}
};
解法三
位运算,推荐
class Solution {
public:
int singleNumber(vector<int>& nums) {
vector<int> binary(32,0);//最高32位
for(int i:nums){
for (int j = 31; j>=0; j--)
{
binary[j]+=i&1;//把nums转换为二进制,加起来
i>>=1;
}
}
int res=0;
for (int j = 31; j>=0; j--)
{
if(binary[j]%3!=0) res+=pow(2,(31-j));//除以3不为0的即为落单的数字
}
return res;
}
};