剑指offer-数组中只出现过一次的数字

题目地址:https://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811?tpId=13&&tqId=11193&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

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

思路:异或相同等于0,两数相同等于0;

这样可以得出两个数 的异或结果,这两个数一定不一样,那么在按位异或时一定会有等于1的情况,我们先找到一个出现1的位置,让其他数据针对这个位分组,再进行异或,消除相同数,得到结果

 1 class Solution {
 2 public:
 3     void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
 4          int x=0;
 5            for(int i=0;i<data.size();++i){
 6             x^=data[i];
 7         }
 8         int f1=0,f2=0;
 9         int len=0;
10         while(x%2==0){
11             len++;
12             x=x>>1;
13         }
14         for(int i=0;i<data.size();++i){
15             if((data[i]>>len)%2){
16                 f1=f1^data[i];
17             }else{
18                  f2=f2^data[i];
19             }
20         }  
21         *num1=f1;
22         *num2=f2;
23     }
24 };
原文地址:https://www.cnblogs.com/cutelife/p/13684469.html