在C ++中设置不匹配

假设有一个集合S,它最初包含从1到n的数字。但是不幸的是,由于某些错误,集合中的一个数字被复制到集合中的另一个数字,这导致一个数字的重复和另一个数字的丢失。

现在,如果我们有一个名为nums的数组,它表示错误后此集合的数据状态。我们的任务是找到发生两次的号码,然后找到遗漏的号码。以数组形式返回结果。

因此,如果输入类似于[1,2,3,4,4,6],则输出为[4,5]

为了解决这个问题,我们将遵循以下步骤-

  • 定义大小为2的数组v

  • s1:= A的所有数字之和

  • n:= A的大小

  • exp_sum:=(n *(n + 1))

  • 对于初始化i:= 0,当i <n时,更新(将i增加1),执行-

    • v [0]:= | A [i] |

    • 从循环中出来

    • A [| A [i] | -1] = -A [| A [i] | -1]

    • 如果A [| A [i] | -1]> 0,然后-

    • 除此以外

    • v [1]:= v [0]-(s1-exp_sum)

    • 返回v

    例 

    让我们看下面的实现以更好地理解-

    #include <bits/stdc++.h>
    using namespace std;
    void print_vector(vector<auto> v){
       cout << "[";
       for(int i = 0; i<v.size(); i++){
          cout << v[i] << ", ";
       }
       cout << "]"<<endl;
    }
    class Solution {
    public:
       vector<int> findErrorNums(vector<int>& A) {
          vector<int> v(2);
          long long int s1 = accumulate(A.begin(), A.end(), 0);
          int n = A.size();
          long long int exp_sum = (n * (n + 1)) / 2;
          for (int i = 0; i < n; i++) {
             if (A[abs(A[i]) - 1] > 0) {
                A[abs(A[i]) - 1] = -A[abs(A[i]) - 1];
             }
             else {
                v[0] = abs(A[i]);
             break;
             }
          }
          v[1] = v[0] - (s1 - exp_sum);
          return v;
       }
    };
    main(){
       Solution ob;
       vector<int> v = {1,2,3,4,4,6};
       print_vector(ob.findErrorNums(v));
    }

    输入值

    {1,2,3,4,4,6}

    输出结果

    [4, 5, ]