0

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

允许重复

只有一个独特的价值

像 :

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

我想得到的价值是:

int unique[]={1}

我怎样才能做到这一点?我已经对我的“for”和“if”感到困惑,这不是家庭作业

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

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

请帮助我:)

这是我做的一些代码

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];
4

4 回答 4

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数组中出现重复项,则可以在分配给唯一数组时跳过相关列表中此数字的所有出现。

  • 如果要记录位置而不是值,请维护两个“唯一位置”数组(每个输入数组一个),并根据需要将i或分配j给相应数组的值。

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

于 2012-04-26T04:09:12.970 回答
0

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

于 2012-04-26T04:48:06.487 回答
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;
}

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

于 2012-04-29T07:34:09.383 回答
0

这是我的算法版本,用于在 C++ 中的 Python 上的排序数组中查找相同元素,它的工作方式类似

def unique_array(array0 : (int), array1 : (int)) -> (int):
index0, index1, buffer = 0, 0, []
while index0 != len(array0) and index1 != len(array1):
    if array0[index0] < array1[index1]:
        buffer.append(array0[index0])
        index0 += 1
    elif array0[index0] > array1[index1]:
        buffer.append(array1[index1])
        index1 += 1
    else:
        index0 += 1; index1 += 1
buffer.extend(array0[index0 : len(array0)])
buffer.extend(array1[index1 : len(array1)])
return buffer
于 2022-02-01T11:26:51.477 回答