2017-01-30 3 views
1

配列の値は1から100の間しかないことがわかっています。それは私の関数が正しくないと思われます。理由を理解できません。ここで は私の機能である:2つの配列が入れ子になっているかどうかを調べる関数を書こうとしました。

int CheckPermutation3(int arr1[], int arr2[], int size) 
{ 
    int count1[100], count2[100]; //the size 100 because in that case values are only between 1 and 100// 
    int i; 

    for(i=0; i<100; i++) 
    { 
     count1[i]=0; 
     count2[i]=0; 
    } 
    for(i=0;i<size;i++) //counting the elements of each array// 
     count1[arr1[i]]++; 
    for(i=0;i<size;i++) 
     count2[arr2[i]]++; 
    for(i=0;i<100;i++) //comparison// 
     if (count1[i]!= count2[i]) 
      return 0; 
    return 1; 
} 
+0

これは方法ではありません。並べ替えて比較する。 –

+0

あなたの機能が正しくないことをあなたに納得させるものは何ですか?データが上記の範囲内にあると仮定すると、それは完全にうまく見えます。それをテストするために特定のデータを使用しましたか? @EugeneSh。 – dasblinkenlight

+0

制限された整数値の範囲がある場合には、カウントに間違いはありません。 – AlexD

答えて

1

実装は何も問題はありません:アイテムが範囲外であれば、これは未定義の動作を引き起こすので、それが動作しない唯一の理由は、あります。

あなたはやや単一のアレイを使用して、コードを簡素化することができ、このように:

int balance[100] = {0}; // Initialize all elements to zero 
for (i = 0 ; i < size ; i++) { 
    balance[arr1[i]-1]++; 
    balance[arr2[i]-1]--; 
} 
for(i=0;i<100;i++) { 
    if (balance[i] != 0) { 
     return 0; 
    } 
} 
return 1; 
+1

番号の範囲は1から100までです(0から99までではありません)ので、 'arrx [i] -1'を実行してください。 – xzoert

+0

@xzoertそうです、ありがとうございます! – dasblinkenlight

0

それが動作しないことが理由だけで1問題があるようです。

インデックスは[0-99]の配列で1から100までの値を格納しています([同梱])。 したがって、arr1 [i]の値が100の場合、ここで破損します。
count1[arr1[i]]++;
範囲外のcount1 [100]をインクリメントしようとしています。

同様に、arr2 [i]の値が100の場合、ここで壊れてしまいます。 count2[arr2[i]]++;


は、この問題を解決するには、次の
1. 101サイズの配列を作成します。
2.
for(i=1;i<=100;i++) //comparison// if (count1[i]!= count2[i]) return 0;

[包括] 1から100まで反復あなたには、いくつかのスペースを節約したい場合は、配列のサイズが100、 であることとARR2
のために、同様にこの
count1[arr1[i]-1]++;
をやらせますcount2[arr2[i]-1]++;
このようにして、各値を配列に格納することができます。 [0番目のインデックス]

+0

それは動作しません.. – TOM1994

+0

より具体的にしてくださいできますか?あなたは何を試しましたか、何がうまくいかなかったのですか?また、失敗したテストケースで質問を更新してください。 –

+0

ありがとうございました!出来た! – TOM1994

関連する問題