• 剑指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 }
  • 相关阅读:
    批量给对象属性赋值
    判断linq语句结果是否为空的方法
    linq var出来的object取值问题
    LinQ转换运算符OfType<T>
    C#退出的几种方式
    return的用法
    扩展文字
    Timer的使用方法
    通过16道练习学习Linq和Lambda
    VS2010 无可用源
  • 原文地址:https://www.cnblogs.com/neverland0718/p/11207643.html
Copyright © 2020-2023  润新知