2012-01-10 14 views
1

を変更私はint配列の長さ3を指定して、この問題をは、C#の配列内の要素の連続的な繰り返しを検索し、要素

を与えられた、 3要素を設定しました({1,2,3})→{1,2,0} ({2,3,5})→{2,5,5} ({1,2,1} )→{1,2,1}

これは私の実装です。

int[] x = { 1, 2, 1 }; 
      for (int i = 0; i < x.Length; i++) 
      { 
       if (x[i] == 2 && x[i + 1] == 3) 
       { 

        for (int j = 0; j < x.Length; j++) 
        { 
         if (x[j]==3) 
         { 
          x[j] = 0; 
         } 
        } 

       } 
      } 

      foreach (int i in x) 
      { 
       Console.Write(i); 
      } 

結果がゼロになりました。私が間違っている場所を見つけるのを助けてくれますか?講師が詳細に何も説明しなかったので、私は理解できません。

答えて

4

あなたはすべてのこれらのループを必要としない:3の長さで、あなただけの2つのチェックを実行する必要があり、このように:

:任意のサイズのアレイの場合

if (x[0]==2 && x[1]==3) x[1] = 0; 
if (x[1]==2 && x[2]==3) x[2] = 0; 

、あなたは、単一のループを使用することができます

for (var i = 0 ; i < x.Length-1 ; i++) { 
    if (x[i]==2 && x[i+1]==3) x[i+1] = 0; 
} 
+0

例もあった。私はちょうどそれを編集しました。 –

+0

@ JasmineAppelblad私は単一のループを理解するだろうが、3つの項目の配列のための3つのネストされたループはあまりにも多い。あなたの3ループプログラムについて正しくないことの1つは 'for(int i = 0; i dasblinkenlight

+0

これはよく説明してくれてありがとう。少なくとも私は0/5を与えてはなりません。とにかく... –

2

コードには、適切なチェックがあります。if (x[i] == 2 && x[i + 1] == 3)ただし、改善できる点は2つあります。

1)x[i + 1]を実行する場合、が配列をオーバーフローするため、iがアレイの最後の要素にならないようにする必要があります。だから、i < x.Length forループの代わりに、i < x.Length - 1を試してください。それはダクトテーピングのようだが、本当に良い方法はない(私が知っているものはない)。

2)の条件がtrueの場合、あなたはその後、2と見つけて、あなたはすでにx[i]があることを知っているにかかわらず、3が2に先行される場合の、0とアレイ内のすべての3に置き換えられますforを持っていますx[i + 1]が3である(この時点でわかっているifによって決定されるように、trueでなければならない)ので、置き換えられる3のインデックスはi + 1です。したがって、x[i + 1] = 0;ループは必要ありません。

+0

説明ありがとうCorey。 –

1

1つのループで実行できます。

// In the test part of the for loop, use ' i < x.Length - 1' 
// so you don't evaluate the last element + 1 and get an IndexOutOfRangeException 
for (int i = 0; i < x.Length - 1; i++) 
{ 
    if (x[i] == 2 && x[i + 1] == 3) 
     x[i + 1] = 0; 
} 
+0

私の本によく書かれている感謝のエージェント - j! :) –

関連する問題