मान लीजिए एक सेट S है जिसमें मूल रूप से 1 से n तक की संख्याएं हैं। लेकिन दुर्भाग्य से, किसी त्रुटि के कारण, सेट में एक संख्या दूसरी संख्या की नकल हो गई, जिसके परिणामस्वरूप एक संख्या की पुनरावृत्ति और दूसरी संख्या की हानि हुई।
अब यदि हमारे पास एक सरणी है जिसे nums कहा जाता है जो इस त्रुटि के बाद सेट की डेटा स्थिति को दर्शाती है। हमारा कार्य उस संख्या को ढूंढना है जो दो बार होती है और फिर उस संख्या को ढूंढना है जो गायब है। परिणाम को एक सरणी के रूप में वापस करें।
इसलिए, यदि इनपुट [1,2,3,4,4,6] जैसा है, तो आउटपुट [4,5] होगा।
इसे हल करने के लिए, हम निम्नलिखित चरणों का पालन करेंगे:
- आकार 2 की एक सरणी
vपरिभाषित करें s1 := A के सभी संख्याओं का योगn := A का आकारexp_sum := (n * (n + 1)) / 2i := 0सेn-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;
}
};
int 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, ]