Чтобы найти неповторяющийся элемент в массиве, первое, что приходит на ум, это то, что если мы сначала отсортируем массив, а затем попытаемся манипулировать им. Процесс сортировки прост и выглядит следующим образом:
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;
}
}
}
После сортировки массива мы можем увидеть различные сценарии ios, такие как:
int arr1[] = {1,1,2,2,3};
int arr2[] = {1,2,2,3,3};
int arr3[] = {1,1,2,3,3};
Мы должны разработать алгоритм так, чтобы он можно дифференцировать и легко манипулировать тремя сценариями ios. Пусть 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, если я XORed его с 3, я получу 0, поэтому если у нас есть массив, скажем, arr [] = {1,2,1}, я сначала назначаю n = 0, затем XOR это с первым элементом (1), затем я XOR n со вторым элементом, а затем с третьим элементом. Что случится? Третий 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).