📌  相关文章
📜  C++ 程序从重复数组中查找丢失的元素

📅  最后修改于: 2022-05-13 01:54:29.947000             🧑  作者: Mango

C++ 程序从重复数组中查找丢失的元素

给定两个除了一个元素之外彼此重复的数组,即其中一个数组中的一个元素丢失,我们需要找到那个丢失的元素。
例子:

Input:  arr1[] = {1, 4, 5, 7, 9}
        arr2[] = {4, 5, 7, 9}
Output: 1
1 is missing from second array.

Input: arr1[] = {2, 3, 4, 5}
       arr2[] = {2, 3, 4, 5, 6}
Output: 6
6 is missing from first array.

一种简单的解决方案是遍历数组并逐个检查元素并在找到不匹配的元素时标记丢失的元素,但这种解决方案需要线性时间过大的数组。
另一种有效的解决方案是基于二进制搜索方法。算法步骤如下:

  1. 在更大的数组中开始二分查找,得到 mid 为 (lo + hi) / 2
  2. 如果两个数组的值相同,则缺少的元素必须在右侧,因此将 lo 设置为 mid
  3. 否则将 hi 设置为 mid 因为如果中间元素不相等,则缺少的元素必须位于较大数组的左侧。
  4. 对于单个元素和零元素数组,单独处理一个特殊情况,单个元素本身将是缺失的元素。
    如果第一个元素本身不相等,则该元素将是缺少的元素。/li>

下面是上述步骤的实现

C++
// C++ program to find missing element from same
// arrays (except one missing element)
#include 
using namespace std;
  
// Function to find missing element based on binary
// search approach.  arr1[] is of larger size and
// N is size of it.  arr1[] and arr2[] are assumed
// to be in same order.
int findMissingUtil(int arr1[], int arr2[], int N)
{
    // special case, for only element which is
    // missing in second array
    if (N == 1)
        return arr1[0];
  
    // special case, for first element missing
    if (arr1[0] != arr2[0])
        return arr1[0];
  
    // Initialize current corner points
    int lo = 0,  hi = N - 1;
  
    // loop until lo < hi
    while (lo < hi)
    {
        int mid = (lo + hi) / 2;
  
        // If element at mid indices are equal
        // then go to right subarray
        if (arr1[mid] == arr2[mid])
            lo = mid;
        else
            hi = mid;
  
        // if lo, hi becomes contiguous,  break
        if (lo == hi - 1)
            break;
    }
  
    // missing element will be at hi index of
    // bigger array
    return arr1[hi];
}
  
// This function mainly does basic error checking
// and calls findMissingUtil
void findMissing(int arr1[], int arr2[], int M, int N)
{
    if (N == M-1)
        cout << "Missing Element is "
        << findMissingUtil(arr1, arr2, M) << endl;
    else if (M == N-1)
        cout << "Missing Element is "
        << findMissingUtil(arr2, arr1, N) << endl;
    else
        cout << "Invalid Input";
}
  
// Driver Code
int main()
{
    int arr1[] = {1, 4, 5, 7, 9};
    int arr2[] = {4, 5, 7, 9};
  
    int M = sizeof(arr1) / sizeof(int);
    int N = sizeof(arr2) / sizeof(int);
  
    findMissing(arr1, arr2, M, N);
  
    return 0;
}


C++
// C++ program to find missing element from one array
// such that it has all elements of other array except
// one.  Elements in two arrays can be in any order.
#include 
using namespace std;
  
// This function mainly does XOR of all elements
// of arr1[] and arr2[]
void findMissing(int arr1[], int arr2[], int M,
                 int N)
{
    if (M != N-1 && N != M-1)
    {
        cout << "Invalid Input";
        return;
    }
  
    // Do XOR of all element
    int res = 0;
    for (int i=0; i


输出 :

Missing Element is 1


如果输入数组的顺序不同怎么办?
在这种情况下,缺少的元素只是两个数组的所有元素的 XOR。感谢 Yolo Song 的建议。

C++

// C++ program to find missing element from one array
// such that it has all elements of other array except
// one.  Elements in two arrays can be in any order.
#include 
using namespace std;
  
// This function mainly does XOR of all elements
// of arr1[] and arr2[]
void findMissing(int arr1[], int arr2[], int M,
                 int N)
{
    if (M != N-1 && N != M-1)
    {
        cout << "Invalid Input";
        return;
    }
  
    // Do XOR of all element
    int res = 0;
    for (int i=0; i

输出 :

Missing Element is 1

有关更多详细信息,请参阅有关从重复数组中查找丢失元素的完整文章!