0

q.整数の配列をランダムな順序で取り、配列内の重複する整数をすべて削除する「remove_duplicates」という名前の関数を含むプログラムを作成します。この関数は 3 つの引数を取る必要があります。

  1. (読み取ってメインに入力する) 整数の配列
  2. 配列のサイズ。
  3. 重複なしで配列内の値の数を示すために main に出力される、参照によって渡される変数。関数は値を返すべきではありませんが、重複する整数が削除された場合、関数はそれをカウントする必要があるため、新しい値は配列内の個別の整数の数を示します。関数に渡される配列が次のようで、関数に渡される配列のサイズが 10 であるとします。

    0 1 2 3 4 5 6 7 8 9 58 | 26 | 91 | 26 | 70 | 70 | 91 | 58 | 58 | 66

この関数は、配列を次のように変更する必要があります。

0       1       2     3       4      5      6      7     8      9    
58 | 26 | 91 | 70 | 66 | ?? | ?? | ?? | ?? | ??

そして、distinct カウンターの値を 5 になるように変更する必要があります。5 番目のセルの後のセルのクエスチョン マークは、関数が戻るときに、それらのセルに含まれる数値は問題にならないことを示しています。

私の機能に何か問題があります

void remove_duplicates ( int h[] ,int n ,int &count ){
count = 0;
int a[100];
for (int i = 0 ; i < n  ; i++ )
        for(int j = i ; j<n ; j++){
            if(h[i]!=h[j])
                        a[i]=h[i];
            else
            count++;
4

4 に答える 4

1
  1. 配列全体をstd::setにコピーします。セットは重複を排除します。つまり、重複の挿入は失敗します。

  2. セットをアレイにコピーして戻します。

  3. 一意の値の数は、セットのサイズです。

于 2012-04-13T12:30:59.623 に答える
0

要素ごとに複数回インクリメントするため、関数が実行されたときのカウントは本来よりも大きくなります。次のようなことを試してください。

    void remove_duplicates ( int h[] ,int n ,int &count ){
count = n;
int a[100],ok,p;
for (int i = 0 ; i < count-1  ; i++ ) {
    ok=1;
    for(int j = i+1 ; j<count ; j++)
        if(h[i]==h[j]) {
            ok=0;
            p=j;
        }
    if(!ok) {
        for(int j = p+1; j<count; j++) 
            h[j-1]=h[j];
        count--;
    }
}
count=n-count;
}

「ok」は、v [i]が配列内の別の場所にあるかどうかをチェックし、pはそれが表示される位置であるため、削除する要素を認識します。配列内の要素の最初の外観を維持する必要があると想定しました。そうしないと、簡単に削除できたはずです。それが役に立てば幸い。

于 2012-04-13T12:31:24.647 に答える
0

これらの問題には多くの解決策があります。一時配列のないものを紹介します。要件で並べ替えアルゴリズムを使用できる場合は、次のコードを適用する前に配列を並べ替えます。

unsigned int numberOfDuplicates = 0;
for( unsigned int i = 1; i<numberOfElements; i++ )
{
  if( array[i-1] == array[i] ){
    numberOfDuplicates++;
    for( unsigned int j = i; j< numberOfElements-1; j++ )
    {
       array[j] = array[j+1];
    }
  }
}

新しい重複を見つけるたびに、配列の残りの部分を1つ左にシフトしてそれを食べます。2番目の解決策は、新しい配列を割り当て、そこにまだ存在しない値のみを渡し、その後、割り当てられた配列をコピーして戻すことです。

アルゴリズムをソートしないと、次のようになります。

unsigned int numberOfDuplicates = 0;
for( unsigned int i = 1; i<numberOfElements; i++ )
{
 for( unsigned int k = i; k < numberOfElements; k++){
   if( array[i-1] == array[k] ){
      numberOfDuplicates++;
      for( unsigned int j = k; j< numberOfElements-1; j++ )
      {
       array[j] = array[j+1];
      }
   }
  }
}
于 2012-04-13T11:52:49.673 に答える
0

定義された範囲または無効な値 (-1 など) が定義されている場合は、重複をこの無効な値に設定できます。配列を走査しているときに重複が見つかったら、要素を最初に戻します。

于 2012-04-13T12:45:55.963 に答える