ปัญหา
สมมติว่ามีเซ็ต S ที่เดิมมีตัวเลขจาก 1 ถึง n แต่ไม่อาจมีเหตุผลหนึ่ง ตัวเลขหนึ่งในเซ็ตถูกทำซ้ำไปยังอีกตัวเลขหนึ่งในเซ็ต ทำให้เกิดการซ้ำของตัวเลขหนึ่งและสูญหายของอีกตัวเลขหนึ่ง
ตอนนี้ หากเรามีอาร์เรย์ที่ชื่อว่า nums ที่แทนสถานะข้อมูลของเซ็ตนี้หลังจากข้อผิดพลาด งานของเราคือหาตัวเลขที่เกิดขึ้นสองครั้ง และหาตัวเลขที่หายไป คืนค่าผลลัพธ์ในรูปของอาร์เรย์
เช่น ถ้าผนวกเข้าเป็น [1,2,3,4,4,6] ผลลัพธ์จะเป็น [4,5]
วิธีแก้ปัญหา
- กำหนดอาร์เรย์ v ขนาด 2
- s1 := ผลรวมของตัวเลขทั้งหมดของ A
- n := ขนาดของ A
- exp_sum := (n * (n + 1)) / 2
- for i := 0 ถึง n-1 ทำ:
- ถ้า A[|A[i]| - 1] > 0:
- A[|A[i]| - 1] = -A[|A[i]| - 1]
- มิฉะนั้น:
- v[0] := |A[i]|
- ออกจากลูป
- ถ้า A[|A[i]| - 1] > 0:
- v[1] := v[0] - (s1 - exp_sum)
- คืนค่า 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, ]