Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ตั้งค่าไม่ตรงกันใน C++


สมมติว่ามีเซต S ที่มีตัวเลขตั้งแต่ 1 ถึง n แต่น่าเสียดาย เนื่องจากข้อผิดพลาดบางประการ ตัวเลขหนึ่งในชุดจึงซ้ำกับอีกหมายเลขหนึ่งในชุด ซึ่งส่งผลให้หมายเลขหนึ่งซ้ำและอีกหมายเลขหนึ่งหายไป

ตอนนี้ถ้าเรามีอาร์เรย์ที่เรียกว่า nums ซึ่งแสดงถึงสถานะข้อมูลของชุดนี้หลังจากเกิดข้อผิดพลาด งานของเราคือการหาจำนวนที่เกิดขึ้นสองครั้งแล้วจึงหาจำนวนที่พลาดไป ส่งกลับผลลัพธ์ในรูปแบบของอาร์เรย์

ดังนั้น หากอินพุตเป็น [1,2,3,4,4,6] ผลลัพธ์จะเป็น [4,5]

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดอาร์เรย์ v ขนาด 2

  • s1 :=ผลรวมของตัวเลขทั้งหมดของ A

  • n :=ขนาดของ A

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

  • สำหรับการเริ่มต้น i :=0 เมื่อ i

    • ถ้า A[|A[i]| - 1]> 0 จากนั้น −

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

    • มิฉะนั้น

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

      • ออกจากวง

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

  • กลับ วี

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

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