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

โปรแกรม C++ หาผลรวมของแฟกทอเรียลในอาร์เรย์ (แก้ไข: หาตัวเลขที่ปรากฏครั้งเดียว)

พิจารณาว่าเรามีอาร์เรย์ A ซึ่งเรียงลำดับแล้ว มีสมาชิกทุกตัวปรากฏ 2 ครั้ง แต่มีตัวเดียวปรากฏแค่ครั้งเดียว เราต้องหาตัวเลขนั้น ถ้าอาร์เรย์เป็น [1, 1, 3, 3, 4, 4, 5, 6, 6, 7, 7, 9, 9] ตัวเลขที่เดี่ยวคือ 5

เราจะใช้วิธี Binary Search เพื่อแก้ปัญหานี้ สมาชิกทั้งหมดก่อนตัวเดี่ยว มีการเกิดครั้งแรกที่ดัชนี 0, 2, 4... และครั้งที่สองที่ 1, 3, 5... แต่หลังตัวเดี่ยว การเกิดครั้งแรกจะอยู่ที่ดัชนีคี่ และครั้งที่สองอยู่ที่ดัชนีคู่

หาดัชนีกลาง mid ถ้า mid เป็นคู่ เปรียบเทียบ A[mid] และ A[mid + 1] ถ้าเหมือนกัน ไปซ้ายหรือขวาตามที่ต้องการ มิฉะนั้นถ้า mid เป็นคี่ เปรียบเทียบ A[mid] และ A[mid - 1] ถ้าเหมือนกัน ไปซ้ายหรือขวาตามที่ต้องการ

ตัวอย่าง

#include <iostream> 
using namespace std; 

void findSingleElement(int *arr, int left, int right) { 
    if (left > right) 
        return; 
    if (left == right) { 
        cout << "The required element is: " << arr[left]; 
        return; 
    } 
    int mid = (left + right) / 2; 
    if (mid % 2 == 0) { 
        if (arr[mid] == arr[mid + 1]) 
            findSingleElement(arr, mid + 2, right); 
        else 
            findSingleElement(arr, left, mid); 
    } else { 
        if (arr[mid] == arr[mid - 1]) 
            findSingleElement(arr, mid + 1, right); 
        else 
            findSingleElement(arr, left, mid - 1); 
    } 
} 

int main() { 
    int arr[] = {1, 1, 3, 3, 4, 4, 5, 6, 6, 7, 7, 9, 9}; 
    int len = sizeof(arr) / sizeof(arr[0]); 
    findSingleElement(arr, 0, len - 1); 
}

ผลลัพธ์

The required element is: 5