剑指offer 面试题56. 数组中只出现一次的两个数字
题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
方法1:用set记录出现过的数字
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
unordered_set<int> st;
for(auto& num:data){
if(st.count(num)){
st.erase(num);
}
else{
st.insert(num);
}
}
bool flag=true;
for(int num:st){
if(flag){
*num1=num;
flag=false;
}
else{
*num2=num;
}
}
}
};
方法2:全部异或起来得p,找p的某一个为1的二进制位。对于所有数据,该位等于1的分一拨,等于0的另一拨。分别异或起来就是num1和num2的值
1 class Solution { 2 public: 3 void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { 4 int p=0; 5 for_each(data.begin(),data.end(),[&p](int num){p=p^num;}); 6 p=p&(-p);//最后一位二进制1的位置 7 for(const int& num:data){ 8 if(num&p){ 9 *num1^=num; 10 } 11 else{ 12 *num2^=num; 13 } 14 } 15 } 16 };
进击的小🐴农

浙公网安备 33010602011771号