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

ค้นหาซิงเกิ้ลในอาร์เรย์ขององค์ประกอบจำนวนเต็ม 2n+1 ใน C++


ในปัญหานี้ เราได้รับอาร์เรย์ที่ประกอบด้วยค่าจำนวนเต็ม (2n+ 1) จากค่าทั้งหมดนี้มีองค์ประกอบ n รายการปรากฏขึ้นสองครั้งในอาร์เรย์และมีองค์ประกอบเพียงรายการเดียวในอาร์เรย์ ที่ปรากฏขึ้นครั้งเดียว งานของเราคือค้นหาซิงเกิ้ลในอาร์เรย์ขององค์ประกอบจำนวนเต็ม 2n+1

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

อินพุต

arr[] = {1, 3, 5, 6, 5, 1, 3}

ผลลัพธ์

5

แนวทางการแก้ปัญหา

วิธีแก้ปัญหาอย่างง่ายคือการใช้ตัวนับสำหรับองค์ประกอบ หากพบองค์ประกอบ ให้เก็บค่าและจำนวนการเกิดขึ้น หลังจากนี้การค้นหาองค์ประกอบในตารางที่มีการนับ =1 โซลูชันที่มีประสิทธิภาพ .มากขึ้น จะใช้ XOR ที่นี่เราจะดำเนินการ XOR ขององค์ประกอบทั้งหมดของอาร์เรย์ XOR นี้จะทำให้องค์ประกอบทั้งหมดที่มีการเกิดสองครั้งเป็น 0 และองค์ประกอบเดียวที่มีค่าจะมีอยู่คือองค์ประกอบที่มีการเกิดเป็น 1

ทั้งนี้เป็นเพราะคุณสมบัติของ XOR ที่ −

- a^a = 0
- a^0 = a

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

ตัวอย่าง

#include <iostream>
using namespace std;
int findSingleValue(int arr[], int n) {
   int element = 0;
   for (int i = 0; i < n; i++)
      element = element ^ arr[i];
   return element;
}
int main() {
   int arr[] = { 1, 3, 5, 6, 5, 1, 3 };
   int n = sizeof(arr) / sizeof(arr[0]);
   cout<<"The element of the array with single occurrence is "<<findSingleValue(arr, n);
   return 0;
}

ผลลัพธ์

The element of the array with single occurrence is 6