C++ 中的 Set 错位


假设有一个集合 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),执行 −

    • 如果 A[|A[i]| - 1] > 0,则 −

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

    • 否则

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

      • 退出循环

  • 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, ]

更新于: 11-6-2020

217 次浏览

开启您的 职业生涯

完成课程后获得认证

开始学习
广告
© . All rights reserved.