找到数组中只出现一次的数

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


异或(XOR)运算:

  • 相同的数 结果为 0
  • 不同的数 结果为 1
  • 0 和 其它数 异或 结果为 数本身
  1. 如果数组中只有一个数出现过一次,那么直接让0和所有数异或,结果即为所求的数;
  2. 因为题目中说有两个数,可以分两组,每个组中为 情况1
  3. 具体的划分方式就是,0和所有数异或的结果,为两个数的异或结果,由于这两个数不同,必定有1出现。二进制,将异或结果从右往左的数,第一次出现1为标志,将数据划分为两组。
#include<iostream>
#include<vector>
using namespace std;



class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {

      int one = 0;
            int len = data.size();
            for (int i=0;i<len;i++)
            {
                one = one ^ data[i];
            }
            int flag = 1;
            while(flag)
            {
                if (flag&one)break;
                flag = flag<<1;
            }
          	int one1 =0;
			int one2 = 0; 
            for (int i=0;i<len;i++)
            {
                if ((data[i]&flag)==flag)one1 = one1^data[i];
                else one2 = one2^data[i];
            }
            *num1 = one1;
            *num2 = one2;
}
};

int main() 
{
	Solution a;
	int num1;
	int num2;
	int *c = &num1;
	int *b = &num2;
	vector<int>v{0,1,2,3,4,2,1,0};
	a.FindNumsAppearOnce(v,c,b);
	cout<<num1<<endl;
	cout<<num2<<endl;
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/xnmc2014/article/details/86627447