查找在数组中出现一次而其他元素出现两次的元素

时间:2020-04-07 21:14:55

标签: c++ arrays sorting

我写的代码复杂度为o(n ^ 2)。我找不到错误。我的想法是先对数组进行排序,然后再从第一个元素开始,如果第二个下一个是i等于2递增,当如果条件不满足则找到元素有人可以帮我这个忙。 预先感谢

#include<iostream>
using namespace std;

int main()
{
int arr[100];
int n,i,j,temp;
cin>>n;
for(i=0;i<n;i++)
{
    cin>>arr[i];
}
for(i=0;i<n;i++)
{
    for(j=0;j<n;j++)
    {
        if(arr[i]>arr[j])
        {
            temp = arr[j];
            arr[j] = arr[i];
            arr[i] = temp;
        }
    }
}
i=0;
for(j=i+1;j<n;j++)
{
    if(arr[i] == arr[j])
    {
        i=i+2;
    }
}
cout<<arr[i];
return 0;
}

1 个答案:

答案 0 :(得分:2)

要在数组中查找非重复元素,首先想到的是,如果我们先对数组进行排序然后尝试对其进行操作。排序过程很简单,如下所示:

    int arr[] = {/*Some array*/};
    int arrSize = sizeof(arr)/sizeof(int);
    //Lets sort the array
    for(int i=0;i<arrSize;i++)
    {
        for(int j=i;j<arrSize;j++)
        {
            if(arr[i]>arr[j])
            {
                int t=arr[i];
                arr[i]=arr[j];
                arr[j]=t;
            }
        }
    }

对数组进行排序后,我们可能会看到不同的情况,例如:

int arr1[] = {1,1,2,2,3};
int arr2[] = {1,2,2,3,3};
int arr3[] = {1,1,2,3,3};

我们必须设计一种算法,使其能够区分并轻松操纵这三种情况。设n为我们的数字。第一种情况是通过以下方法检查最后一个与上一个是否不同:

    if(arr[arrSize-1] != arr[arrSize-2]) //The last is not the same as the previous
    {
        n=arr[arrSize-1];
    }

第二个类似于第一个:

    if(arr[0] != arr[1]) // The first element is not the same as the second
    {
        n = arr[0];
    }

第三个也很容易,我们只需要检查两个邻居是否永远不等于中间数,就可以了:

        for(int i=1;i<arrSize-1;i++)
        {
            if(arr[i-1] != arr[i] && arr[i] != arr[i+1])
            {
                n=arr[i];
                break;
            }
        }

因此完整的代码将变为:

#include <iostream>
using namespace std;

int main()
{
    int arr[] = {1,2,3,4,2,3,1};
    int arrSize = sizeof(arr)/sizeof(int);
    //Lets sort the array
    for(int i=0;i<arrSize;i++)
    {
        for(int j=i;j<arrSize;j++)
        {
            if(arr[i]>arr[j])
            {
                int t=arr[i];
                arr[i]=arr[j];
                arr[j]=t;
            }
        }
    }
    int n;
    if(arr[0] != arr[1]) // The first element is not the same as the second
    {
        n = arr[0];
    }
    else if(arr[arrSize-1] != arr[arrSize-2]) //The last is not the same as the previous
    {
        n=arr[arrSize-1];
    }
    else //Lets search for a number such that its not the same as the numbers on the left and on the right
    {
        for(int i=1;i<arrSize-1;i++)
        {
            if(arr[i-1] != arr[i] && arr[i] != arr[i+1])
            {
                n=arr[i];
                break;
            }
        }
    }
    cout << n;
}

第二种方式(更好的一种)。

这是我们可以解决此问题的另一种方法。假设我有一个数字n = 3,如果我将它与3进行异或运算,我将得到0,所以如果我们有一个数组,假设arr [] = {1,2,1},我首先分配n = 0,然后进行异或它与firs元素(1)进行交互,接下来对I与第二个元素进行异或,然后对第三个元素进行异或。会发生什么?第三个XOR将抵消第一个XOR的影响,因此n等于1。示例代码:

#include <iostream>
using namespace std;

int main()
{
    int arr[] = {1,2,3,4,2,3,1};
    int arrSize = sizeof(arr)/sizeof(int);
    int n=0;
    for(int i=0;i<arrSize;i++)
    {
        n^=arr[i];
    }
    cout << n;
}

此代码为O(n)。