0

2 つの int 配列から一意の値を取得する必要があります

重複は許可されています

一意の値は 1 つだけです

お気に入り :

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

仮定:

  • 長さの異なる 2 つの配列があり、
  • 配列はソートされています
  • 配列には重複する値を含めることができます
  • 配列の1つにのみ表示される値のリストを取得したい
    • 存在する場合は重複を含む

あなたができる(テストされていない):

// 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、一意の配列に割り当てるときに、関連するリストでこの番号のすべての出現をスキップできます。

  • 値の代わりに位置を記録する場合は、「一意の位置」の 2 つの配列 (入力配列ごとに 1 つ) を保持し、必要に応じて、iまたはの値をj対応する配列に割り当てます。

  • 一意の値が 1 つしかない場合は、割り当てを一意の配列に変更して返します。

于 2012-04-26T04:09:12.970 に答える
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

必要に応じて、標準ライブラリのset_symmetric_difference()関数も参照することをお勧めします。ただし、重複した値の処理は、控えめに言っても、その使用を少しトリッキーにします。

于 2012-04-26T04:48:06.487 に答える