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

เซ็ตไม่ตรงกันใน C++

ปัญหา

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

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

เช่น ถ้าผนวกเข้าเป็น [1,2,3,4,4,6] ผลลัพธ์จะเป็น [4,5]

วิธีแก้ปัญหา

  1. กำหนดอาร์เรย์ v ขนาด 2
  2. s1 := ผลรวมของตัวเลขทั้งหมดของ A
  3. n := ขนาดของ A
  4. exp_sum := (n * (n + 1)) / 2
  5. for i := 0 ถึง n-1 ทำ:
    • ถ้า A[|A[i]| - 1] > 0:
      • A[|A[i]| - 1] = -A[|A[i]| - 1]
    • มิฉะนั้น:
      • v[0] := |A[i]|
      • ออกจากลูป
  6. v[1] := v[0] - (s1 - exp_sum)
  7. คืนค่า v

ตัวอย่างโค้ด C++

#include <bits/stdc++.h> 
using namespace std; 

void print_vector(vector<auto> v){ 
    cout << "["; 
    for(int i = 0; i 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, ]