2017-10-25 10 views
-2

配列から重複する要素を削除するアルゴリズムです。配列のサイズが5のときは動作しますが、要素を追加すると文字とreturnが返されます。例えば、この配列の出力は、 'PBMZOS'ではなく 'PBMZnnOS'です。アルゴリズム - 配列から重複する要素を削除する

int main() 
{ 

    char array[21]={'P','B','B','B','B','M','B','Z','P','P','Z','P','P','P','O','O','O','S','Z','P','M'}; 

    char newarray[21]; 

    newarray[0]=array[0]; 

    int count = 1; 
    bool find = false; 
    int let = 0; 
    for(int i = 1; i < 21; i++,count++) 
    { 
     int j; 
     for(j = 0; j < count; j++) 
     { 
      if(array[i]!=array[j]) 
       find = true; 
      else if(array[i]==array[j]) 
      {  
       find = false; 
       break; 
      } 
     } 
     if(find) 
     { 
      newarray[i]=array[j]; 
      let++; 
     } 
    } 
    for(int i = 0; i <= 21; i++) 
     printf("%c",newarray[i]); 
    printf("\n"); 
    return 0; 
} 
+0

が含ま配列をソートして、新しい配列に非連続的な要素をコピーします。 –

+0

文字列から要素を削除した場合、その長さはもはや21になることはないため、印刷のループにはより良い制限が必要です。 –

+1

また、配列インデックスについて考えてみましょう。 'newarray'にはいくつの要素がありますか? *有効*はいくつですか? –

答えて

-1

int main() { 
char arr[21]={'P','B','B','B','B','M','B','Z','P','P','Z','P','P','P','O','O','O','S','Z','P','M'}; 
int i, j, k; 
int size =sizeof(arr)/sizeof(arr[0]);// calculate size of array 
//create unique array 
for (i = 0; i < size; i++) { 
    for (j = i + 1; j < size;) { 
    if (arr[j] == arr[i]) {  // if any array elemnt matches with previous one 
     for (k = j; k < 21; k++) { 
      arr[k] = arr[k + 1];  
     } 
     size--; 
    } else 
     j++; 
    } 
} 
for (i = 0; i < size; i++) { 
    printf("%c ", arr[i]); 
} 
return 0; 
} 
+1

コメントなしの回答のソースコードはうまく受信されず、フォーマットが不適切な場合はさらに少なくなります。 –

+1

コードを説明してもらえますか? – ruhul

+0

最初のiとjは、現在のelemntと前のelemntが同じ場合は、[k] = a [k + 1]で繰り返しているelemntをスキップします。 –

0

あなたはiの各値の割り当てを行わないにもかかわらず、newarrayにそれぞれの新しい価値を置く場所を追跡するためにiを使用しています。また、arrayに重複があった場合でも、newarrayのすべての要素を印刷しています。

0

コードにいくつかの誤りがあります。私はそれらのエラーを指摘しています。

int main() 
{ 

    char array[21]={'P','B','B','B','B','M','B','Z','P','P','Z','P','P','P','O','O','O','S','Z','P','M'}; 

    char newarray[21]; 

    newarray[0]=array[0]; 

    int count = 1; 
    bool find = false; 

    // should let be zero? 

    int let = 0; 
    for(int i = 1; i < 21; i++,count++) 
    { 
     int j; 
     // find should be re initialized. 
     for(j = 0; j < count; j++) 
     { 
      if(array[i]!=array[j]) 
       find = true; 
      else if(array[i]==array[j]) 
      {  
       find = false; 
       break; 
      } 
     } 
     if(find) 
     { 
      // it should be newarray[let] = array[j]; 
      newarray[i]=array[j]; 
      let++; 
     } 
    } 
    // i<let. 
    for(int i = 0; i < let; i++) 
     printf("%c",newarray[i]); 
    printf("\n"); 
    return 0; 
} 
+2

最終ループを忘れました。 –

+0

これでも間違った結果が表示されることがあります。 i <= 21。ユニット化されたnewarrayは、文字が有効であるところまで印刷します。 –

+0

私の編集を反映させる時間を与えてください。 :P – ruhul

関連する問題