系列文章目录
前言
每天进步一点点!!
一、背景
二、我的思路
分析题目:除了一个元素落单,其它元素都有仅有一个对象。
1.暴力求解(超时)
class Solution {
public:
int singleNumber(vector<int>& nums) {
//暴力求解
bool flag=false;
for ( int i=0;i<nums.size() ; i++)
{
flag=false;
for ( int j=0; j<nums.size() ; j++)
{
if(i==j)
{
continue;
}
if (nums[i]==nums[j])
{
flag=true;
//cout<<flag<<endl;
break;
}
}
//cout<<" d "<<flag<<endl;
if(!flag)
return nums[i];
}
return 0;
}
};
2.sort排序
尤其考虑元素个数只有一两个的特殊情况,不然会出现数组溢出的情形。
class Solution {
public:
int singleNumber(vector<int>& nums) {
//忘记了最简单的排序了,噗
sort(nums.begin(),nums.end() );
if(nums.size()==1)
return nums[0];
else if(nums.size()>=2)
{
if(nums[0]!=nums[1])
return nums[0];
if(nums[nums.size()-1]!=nums[nums.size()-2])
return nums[nums.size()-1];
}
for ( int i=1;i<nums.size()-1 ; i++)
{
if(nums[i]!=nums[i-1]&&nums[i]!=nums[i+1])
{
return nums[i];
}
}
return 0;
}
};
3.map或unordered_map
不排序的map更快!!!
class Solution {
public:
int singleNumber(vector<int>& nums) {
//用map统计次数
unordered_map<int,int> record;
for ( int i=0;i<nums.size() ; i++)
{
record[nums[i]]+=1;
}
for(auto it=record.begin();it!=record.end();it++)
{
if(it->second==1)
{
return it->first;
}
}
return 0;
}
};
三、官方的思路
1.异或运算(二进制位)
核心:
class Solution {
public:
int singleNumber(vector<int>& nums) {
//借鉴某网友的思路
//所有的数进行异或操作,重复的数异或得0,而0与任何数异或保留原值
int ans=0;
for(int i:nums)
{
ans ^=i;//异或操作
}
return ans;
}
};
总结
方法多多,但是最巧妙那个,想不到艾!