剑指offer 面试题56. 数组中只出现一次的两个数字

题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

方法1:用set记录出现过的数字

class Solution {
public:
    void FindNumsAppearOnce(vector data,int* num1,int *num2) {
        unordered_set 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 };

 

你可能感兴趣的:(剑指offer 面试题56. 数组中只出现一次的两个数字)