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

หาตัวเลขที่หายไปหนึ่งตัวในช่วงด้วย C++


ในปัญหานี้ เราได้รับอาร์เรย์ arr[] ขนาด n ภารกิจของเราคือ หาตัวเลขที่หายไปหนึ่งตัวในช่วง

อาร์เรย์ประกอบด้วยค่าทั้งหมดตั้งแต่ค่าน้อยที่สุดถึง (ค่าน้อยที่สุด + n) องค์ประกอบหนึ่งของช่วงหายไปจากอาร์เรย์ และเราต้องหาค่าที่หายไปนี้

มาดูตัวอย่างเพื่อเข้าใจปัญหา

อินพุต

arr[] = {4, 8, 5, 7}

เอาต์พุต

6

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

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

วิธีนี้เป็นวิธีที่ naive และจะแก้ปัญหาในเวลา O(n log n)

อีกวิธีหนึ่งในการแก้ปัญหาในเวลาน้อยกว่าคือการใช้ XOR ของค่าของอาร์เรย์และช่วง เราจะหา XOR ของค่าทั้งหมดในช่วงและหา XOR ของค่าทั้งหมดของอาร์เรย์ XOR ของทั้งสองค่านี้จะเป็นค่าที่หายไปของเรา

ตัวอย่าง

โปรแกรมสาธิตการทำงานของวิธีแก้ปัญหาของเรา

#include <bits/stdc++.h> using namespace std; int findMissingNumArr(int arr[], int n){    int arrMin = *min_element(arr, arr+n);    int numXor = 0;    int rangeXor = arrMin;    for (int i = 0; i < n; i++) {       numXor ^= arr[i];       arrMin++;       rangeXor ^= arrMin;    }    return numXor ^ rangeXor; } int main(){    int arr[] = { 5, 7, 4, 8, 9};    int n = sizeof(arr)/sizeof(arr[0]);    cout<<"The missing value in the array is "<<findMissingNumArr(arr, n);    return 0; }

เอาต์พุต

The missing value in the array is 6