剑指offer系列32:数组中只出现一次的数字

第一个方法,用map存vector里的数

 1 #include<iostream>
 2 #include <vector>
 3 #include <map>
 4 using namespace std;
 5 class Solution {
 6 public:
 7     void FindNumsAppearOnce(vector<int> data, int* num1, int *num2) {
 8         if (data.empty())
 9             return;
10         map<int, int> test;
11         for (int i = 0; i < data.size(); i++)
12         {
13             test[data[i]]++;
14         }
15         //auto map_it = test.begin();
16         vector<int> v;
17         for (int i = 0; i < data.size(); i++)
18         {
19             if (test[data[i]] == 1)
20                 v.push_back(data[i]);
21 
22         }
23         //num1 = &v[0];
24         //num2 = &v[1];
25         //这里开始我写成这样,然后一直不通过 。原因是如果只修改指针指向,相当于只修改了局部变量,出函数之后,num1的值还是没变
26 
27         *num1 = v[0];
28         *num2 = v[1];
29         cout << *num1 <<"    "<< *num2;
30         cout << endl;
31     }
32 };
33 int main()
34 {
35     Solution so;
36     vector<int> test1 = { 2,4,3,6,3,2,5,5 };
37     int num1, num2;
38     so.FindNumsAppearOnce(test1,&num1,&num2);
39     cout << num1 << "    " << num2;
40     return 0;
41 }

第二种方法就是剑指offer上的,主要是要知道一点,一个数异或自己等于0。因此如果数组中只有一个出现以此的数字,将这个数组依次异或就可以得到。基于此,将数组按第一次异或后的结果分为两部分,这两部分分别含有一个出现一次的数字。对这两个数组在异或即可。这个方法不是很好想出来啊。

 1 #include<iostream>
 2 #include <vector>
 3 using namespace std;
 4 class Solution {
 5 public:
 6     void FindNumsAppearOnce(vector<int> data, int* num1, int *num2)
 7     {
 8         if (data.empty())
 9             return;
10         int auxi = 0;
11         vector<int> v1;
12         vector<int> v2;
13         for (int i = 0; i < data.size(); i++)
14             auxi ^= data[i];
15         int index = findindex(auxi);
16         for (int i = 0; i < data.size(); i++)
17         {
18             if (bite(data[i], index))
19                 v1.push_back(data[i]);
20             else
21                 v2.push_back(data[i]);
22         }
23         auxi = 0;
24         int auxi2 = 0;
25         for (int i = 0; i < v1.size(); i++)
26             auxi ^= v1[i];
27         for (int i = 0; i < v2.size(); i++)
28             auxi2 ^= v2[i];
29         *num1 = auxi;
30         *num2 = auxi2;
31     }
32     int findindex(int x)//从右起,找到第一个为1的位
33     {
34         int count = 0;
35         while (((x&1)==0)&&(count<8*sizeof(int)))
36         {
37             x=x >> 1;
38             count++;
39         }
40         return count;
41     }
42     bool bite(int a, int b)//判断a的右起第b为是否为1
43     {
44         a = a >> b;
45         if (a&1)
46         {
47             return true;
48         }
49         else
50             return false;
51     }
52 };
53 int main()
54 {
55     Solution so;
56     vector<int> test1 = { 2,4,3,6,3,2,5,5 };
57     int num1, num2;
58     so.FindNumsAppearOnce(test1,&num1,&num2);
59     cout << num1 << "    " << num2;
60     return 0;
61 }

 

posted @ 2019-07-18 15:29  妮妮熊  阅读(131)  评论(0编辑  收藏  举报