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

เขียนโปรแกรม C++ เพื่อหาตัวเลขบวกที่หายไปในอาร์เรย์จำนวนเต็มที่ไม่ได้เรียงลำดับ

สมมติว่าเรามีอาร์เรย์ของจำนวนเต็มที่ไม่ได้เรียงลำดับ งานคือหาตัวเลขบวกที่หายไปซึ่งไม่มีอยู่ในอาร์เรย์ที่กำหนดในช่วง [0 ถึง n] ตัวอย่างเช่น

ตัวอย่างอินพุต 1

N = 9, arr = [0, 2, 5, 9, 1, 7, 4, 3, 6]

เอาต์พุต

8

คำอธิบาย

ในอาร์เรย์ที่ไม่ได้เรียงลำดับ '8' คือจำนวนเต็มบวกเพียงตัวเดียวที่หายไป ดังนั้นเอาต์พุตคือ '8'

ตัวอย่างอินพุต 2

N = 1, arr = [0]

เอาต์พุต

1

คำอธิบาย

ในอาร์เรย์ที่กำหนด '1' คือจำนวนเต็มบวกเพียงตัวเดียวที่หายไป ดังนั้นเอาต์พุตคือ '1'

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

มีหลายวิธีในการแก้ปัญหานี้ อย่างไรก็ตาม เราสามารถแก้ปัญหานี้ในเวลา O(n) แบบเส้นตรงและพื้นที่ O(1) แบบคงที่ได้

เนื่องจากเรารู้ว่าอาร์เรย์ของเรามีขนาด n และมีองค์ประกอบอยู่ในช่วง [0 ถึง n] อย่างแน่นอน ดังนั้นถ้าเราทำ XOR operation ของแต่ละองค์ประกอบและดัชนีของมันกับ 'n' เราสามารถหาตัวเลขผลลัพธ์เป็นตัวเลขที่ไม่ซ้ำกันที่หายไปจากอาร์เรย์ได้

  • รับอินพุตขนาด N ของอาร์เรย์พร้อมองค์ประกอบในช่วง [0 ถึง n]
  • ฟังก์ชัน integer findMissingNumber(int arr[], int size) รับอาร์เรย์และขนาดเป็นอินพุตและคืนค่าตัวเลขที่หายไป
  • ให้ n เป็นตัวเลขที่หายไปเพื่อทำ XOR operation
  • วนลูปผ่านองค์ประกอบอาร์เรย์ทั้งหมดและทำ XOR operation กับแต่ละองค์ประกอบอาร์เรย์และดัชนีของมันเกี่ยวกับตัวเลขที่หายไป คือ n
  • ตอนนี้คืนค่าตัวเลขที่หายไป

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

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

int findMissingNumber(int *arr, int size) {
    int missing_no = size;
    for (int i = 0; i < size; i++) {
        missing_no ^= i ^ arr[i];
    }
    return missing_no;
}

int main() {
    int n = 6;
    int arr[n] = {0, 4, 2, 1, 6, 3};
    cout << findMissingNumber(arr, n) << endl;
    return 0;
}

ผลลัพธ์

ถ้าเราจะรันโค้ดด้านบน จะพิมพ์เอาต์พุตเป็น

5

ถ้าเราทำ XOR operation กับแต่ละองค์ประกอบของอาร์เรย์และดัชนีของมัน จะพิมพ์ '5' ซึ่งหายไปจากอาร์เรย์