集合 s
包含从 1
到 n
的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。
给定一个数组 nums
代表了集合 S
发生错误后的结果。
请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
示例 1:
输入:nums = [1,2,2,4] 输出:[2,3]
示例 2:
输入:nums = [1,1] 输出:[1,2]
思路:
首先排序找到重复的数字nums[i]==nums[i-1] 然后计算出缺失的数字,然后设正常情况加和为sum1,给定数组加和为sum2,由数学关系可以得到:缺失的数字=重复的数字-sum2+sum1
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
vector<int> findErrorNums(vector<int>& nums) {
vector<int> ret{0,0};
sort(nums.begin(),nums.end());
int sum1,sum2;
sum1=1;
sum2=nums[0];
for(int i=1;i<nums.size();i++){
//cout<<nums[i]<<endl;
if(nums[i]==nums[i-1]){
ret[0]=nums[i];
}
sum1+=i+1;
sum2+=nums[i];
}
ret[1]=ret[0]-sum2+sum1;
return ret;
}
};
int main(){
Solution a;
vector <int> t{4,2,2,1};
vector <int> ans=a.findErrorNums(t);
cout<<ans[0]<<" "<<ans[1]<<endl;
return 0;
}