2012-01-10 32 views
1

我得到這個問題發現在C#數組元素的連續重複而改變

給出的int數組長度3,如果有緊跟一個3陣列中的2, 設置3元素的元素({1,2,3})→{1,2,0} ({2,3,5})→{2,0,5} ({1,2,1}}對於示例({1,2,3})→{1,2,0} )→{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的長度,你需要執行只有兩次檢查,像這樣:

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

還有一個例子。我剛剛編輯它。 – 2012-01-10 04:34:08

+0

@JasmineAppelblad我會理解一個單一的循環,但三個項目的數組的三個嵌套循環是太多了。有一件事對你的三循環程序是不正確的:for(int i = 0; i dasblinkenlight 2012-01-10 04:40:14

+0

這很好解釋,謝謝。至少我不應該給0/5。無論如何... – 2012-01-10 04:44:33

2

在你的代碼中,你有一個適當的檢查:if (x[i] == 2 && x[i + 1] == 3)然而,有2件事情你可以改善。

1)如果你打算做x[i + 1]你需要確保i永遠不會是數組的最後一個元素,因爲+ 1會溢出數組。因此,不要在for循環中使用i < x.Length,請嘗試i < x.Length - 1。它看起來像管道錄音,但沒有一個更好的方法(我都不知道)。 2)如果條件爲真,那麼您將有一個for,它將查找並替換數組中的每個3都爲0,而不管3是否前面有2。您已經知道x[i]是2並且x[i + 1]爲3(由if確定,我們知道此時必須爲true),因此要替換的3的索引爲i + 1,因此:x[i + 1] = 0;不需要循環。

+0

許多感謝解釋科裏。 – 2012-01-10 04:45:13

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

感謝agent-j,在我的書中注意到! :) – 2012-01-10 04:47:02