第一个方法,用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 }