概述:数组中一个元素出现一次,其余元素出现两次,找出这个元素。
思路:遍历数组中元素,依次使用异或运算,得到的结果即为单一元素。因为两个相同元素相异或得到的结果为0,而非0元素异或上0得到的是本身。
```
int singleNumber(vector<int>& nums) {
int res=0;
for(int i=0;i<nums.size();i++) res^=nums[i];
return res;
}
```
概述:一个数组中除一个数字只出现一次之外,其他数字都出现了三次。找出只出现一次的数字。
思路:判断每一位上1出现的次数cnt,如果是三的倍数,则单一元素对应位一定为0,否则为1;确定每一位后便得到该元素。
```
int singleNumber(vector<int>& nums) {
int cnt,res=0;
for(int i=0;i<32;i++){
cnt=0;
int h=1<<i;
for(int j=0;j<nums.size();j++) {
if(h&nums[j]) cnt++;
}
if(cnt%3!=0) res+=1<<i;
}
return res;
}
```
概述:一个数组里除两个数字之外,其他数字都出现了两次找出这两个只出现一次的数字。
思路:我们需要把这两个数分开,数组异或一遍得到num,num必定有一位为1,说明这两个数在这一位上不相同,分别与每一个数字作异或,相同则第一组,不同的话就第二组,二者一定会被分开。
```
vector<int> singleNumbers(vector<int>& nums) {
vector<int>res;
int len=nums.size();
if(!len) return res;
int a=0,b=0,num=0;
for(int i=0;i<len;i++) num^=nums[i];
int h=1;
while((num&h)==0){
h<<=1;
}
for(int i=0;i<len;i++){
if(h&nums[i])
a^=nums[i];
else b^=nums[i];
}
res.push_back(a);
res.push_back(b);
return res;
}
```