C / C ++如何从2个数组中获取唯一值?

时间:2012-04-26 03:44:40

标签: c++ c arrays unique

我需要从2个int数组中获取唯一值

允许重复

只有一个唯一值

喜欢:

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

我希望获得的价值是:

int unique[]={1}

我该怎么做? 我已经混淆了我的' for'和'如果' 这不是功课

我知道如何合并2个数组和del重复值

但我需要知道哪个数组具有唯一值

请帮帮我:)。

这是我做过的一些代码

int arr1[3]={1,2,3}
int arr2[3]={2,2,3}
int arrunique[1];
bool unique = true;
for (int i=0;i!=3;i++)
{

    for (int j=0;j!=3;j++)
    {
    if(arr1[i]==arr2[j])
    {
        unique=false;
        continue;
    }
    else 
    {
        unique=true;
    }
if(unique)
{
arrunique[0]=arr1[i]
break;
}
}

cout << arrunique[0];

3 个答案:

答案 0 :(得分:5)

假设:

  • 您有两个不同长度的数组
  • 数组已排序
  • 数组中可以包含重复的值
  • 您希望获取仅出现在其中一个数组中的值列表
    • 包括其副本(如果有)

你可以做(​​未经测试):

// Assuming arr1[], arr2[], and lengths as arr1_length  
int i = 0,j = 0, k = 0;
int unique[arr1_length + arr2_length];

while(i < arr1_length && j < arr2_length) {
   if(arr1[i] == arr2[j]) {
     // skip all occurrences of this number in both lists
     int temp = arr1[i];
     while(i < arr1_length && arr1[i] == temp) i++;
     while(j < arr2_length && arr2[j] == temp) j++;
   } else if(arr1[i] > arr2[j]) {
     // the lower number only occurs in arr2
     unique[k++] = arr2[j++]; 
   } else if(arr2[j] > arr1[i]) {
     // the lower number only occurs in arr1
     unique[k++] = arr1[i++]; 
   }     
}

while(i < arr1_length) {
   // if there are numbers still to read in arr1, they're all unique
   unique[k++] = arr1[i++];
}
while(j < arr2_length) {
   // if there are numbers still to read in arr2, they're all unique
   unique[k++] = arr2[j++];
}

一些替代方案:

  • 如果您不想要unique数组中的重复项,则可以在分配给唯一数组时跳过相关列表中所有出现的此数字。

  • 如果要记录位置而不是值,则保持两个“唯一位置”数组(每个输入数组一个)并指定ij的值到适当的相应数组。

  • 如果只有一个唯一值,请将分配更改为要返回的唯一数组。

答案 1 :(得分:0)

根据您的需要,您可能还需要查看标准库的set_symmetric_difference()功能。但是,至少可以说,它对重复值的处理使得它的使用有点棘手。

答案 2 :(得分:0)

#include <stdio.h>
#include <stdlib.h>
int cmp ( const void *a , const void *b )
{
        return *(int *)a - *(int *)b;
}
int main()
{
int arr1[5] = {5,4,6,3,1};
int arr2[3] = {5, 8, 9};
int unique[8];

qsort(arr1,5,sizeof(arr1[0]),cmp);

printf("\n");

qsort(arr2,3,sizeof(arr2[0]),cmp);

//printf("%d", arr1[0]);
int i = 0;
int k = 0;
int j = -1;

while (i < 5 && k < 3)
{
    if(arr1[i] < arr2[k])
    {
        unique[++j] = arr1[i];
        i++;
    }
    else if (arr1[i] > arr2[k])
    {
        unique[++j] = arr2[k];
        k++;
    }
    else
    {
        i++;
        k++;
    }
}
//int len = j;
int t = 0;
if(i == 5)
{
    for(t = k; t < 3; t++)
        unique[++j] = arr2[t];
}
else
    for(t = i; t < 5; t++)
        unique[++j] = arr2[t];

for(i = 0; i <= j; i++)
    printf("%d ", unique[i]);
return 0;
}

这是我的代码,虽然有一个很好的答案。 我没有意识到知道哪个数组具有唯一值的想法。 我也认为你选择的正确答案也没有。