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, ]
广告
数据结构
组建网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP