136. 只出现一次的数字
题目链接:https://leetcode.cn/problems/single-number/
class Solution {
public:
int singleNumber(vector<int>& nums) {
vector<int>::iterator it=nums.begin();
int ret=0;
while(it!=nums.end()){
ret^=*it;
it++;
}
return ret;
}
};
137. 只出现一次的数字 II
题目链接:https://leetcode.cn/problems/single-number-ii/description/
class Solution {
public:
int singleNumber(vector<int>& nums) {
vector<int> bitarry;
bitarry.resize(32,0);
vector<int>::iterator it=nums.begin();
while(it!=nums.end()){
for(size_t i=0;i<32;i++){
if((*it)&(1<<i)){//判断*it的第i位是否为1
++bitarry[i];
}
}
++it;
}
int ret=0;
for(int i=0;i<32;i++){
cout<<bitarry[i]<<" ";
if(bitarry[i]%3){//出现一次的数的第i个Bit位为3n+1
ret|=(1<<(i));//ret^=(1<<(*it))
}
}
return ret;
}
};
260. 只出现一次的数字 III
题目链接:https://leetcode.cn/problems/single-number-iii/description/
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int num=0;
for(int i=0;i<nums.size();i++){
num^=nums[i];
}
int pos=0;
for(int i=0;i<32;i++){//找出两个数比特位不同的位置
if(num&(1<<i)){
pos=i;
break;
}
}
int num1=0,num2=0;
for(int i=0;i<nums.size();++i){
if(nums[i]&(1<<pos)){//po比特位为1
num1^=nums[i];
}
else{//pos比特位为0
num2^=nums[i];
}
}
vector<int> ret;
ret.push_back(num1);
ret.push_back(num2);
return ret;
}
};