2016-05-29 40 views
2

我很新到Java,但我已經掌握了一些基本...移動和合並數組中的元素?

所以我有4個整數組成的數組,我需要移動到陣列的前端,或合併他們,如果他們是平等的所以:

  • {0,1,0,2}變成{1,2,0,0}
  • {2,1,0,2}變成{2,1,2,0 }
  • {1,1,0,0}變成{2,0,0,0}
  • {0,2,0,2}變成{4,0,0,0}
  • {1,1,3,3} tur NS爲{2,6,0,0}
  • {2,2,2,2}變成{4,4,0,0}等等...

這裏是我到目前爲止:

public void combine(int[] row) 
{ 
    for (int i = 0; i < row.length-1; i++) 
    { 
     if (row[i] == 0 && row[i+1] > 0) //move 
     { 
      row[i] = row[i+1]; 
      row[i+1] = 0; 
     } 
     if (row [i] == row[i+1] && row[i] > 0) //merge 
     { 
      row[i] = 2 * row[i]; 
      row[i+1] = 0; 
     } 
    } 
    System.out.println(row[0]); 
    System.out.println(row[1]); 
    System.out.println(row[2]); 
    System.out.println(row[3]); 
} 

的問題是:

  • {0,1,0,2}爲{1,0,2,0}
  • {0,2,0,2}變爲{2,0,2,0}
  • {1,1,3,3}變成{2,3,3,0}
  • {2,2,2,2} {變得} 4,2,2,0

它不完全合併,或者它只是移動和合並一次出於某種原因?我想知道我做錯了什麼,所以我可以學習,謝謝!

請問有人能幫助我嗎?我真的很感激......謝謝!

+1

我看到你的問題有兩個步驟。首先,您需要對數組進行排序以將所有零向右推。這種有氣泡排序的味道。接下來,您需要執行組合步驟,您可以選擇組合兩個條目。 –

回答

0

您似乎需要先移動到前面,然後合併您的元素,然後再移動到前面。合併實現相對簡單,檢查數組中的偶數索引;如果兩個相鄰的元素相等,則一個乘以兩個,並將另一個設爲0。像,

private static void merge(int[] arr) { 
    for (int i = 0; i + 1 < arr.length; i += 2) { 
     if (arr[i] == arr[i + 1]) { 
      arr[i] *= 2; 
      arr[i + 1] = 0; 
     } 
    } 
} 

我將與swap開始,涉及一種用於移動移動元件陣列中的像

private static void swap(int[] arr, int i, int j) { 
    if (i == j) { 
     return; 
    } 
    int t = arr[i]; 
    arr[i] = arr[j]; 
    arr[j] = t; 
} 

然後向前方,檢查從左側的每個元件;當我們得到一個0開始從非零右看,然後交換

private static void moveToFront(int[] arr) { 
    for (int i = 0; i < arr.length; i++) { 
     if (arr[i] == 0) { 
      for (int j = arr.length - 1; j > i; j--) { 
       if (arr[j] != 0) { 
        swap(arr, i, j); 
       } 
      } 
     } 
    } 
} 

接下來,combine; 前移合併然後前移再次

public static void combine(int[] row) { 
    moveToFront(row); 
    merge(row); 
    moveToFront(row); 
} 

最後,我們可以測試它像

public static void main(String[] args) { 
    int[][] arr = { { 0, 1, 0, 2 }, // turns into {1,2,0,0} 
      { 2, 1, 0, 2 }, // turns into {2,1,2,0} 
      { 1, 1, 0, 0 }, // turns into {2,0,0,0} 
      { 0, 2, 0, 2 }, // turns into {4,0,0,0} 
      { 1, 1, 3, 3 }, // turns into {2,6,0,0} 
      { 2, 2, 2, 2 } };// turns into {4,4,0,0} 
    for (int[] a : arr) { 
     combine(a); 
     System.out.println(Arrays.toString(a)); 
    } 
} 

我也得到(的要求)

[1, 2, 0, 0] 
[2, 1, 2, 0] 
[2, 0, 0, 0] 
[4, 0, 0, 0] 
[2, 6, 0, 0] 
[4, 4, 0, 0] 
0

問題是移動和合並在你的代碼中只有一步移動,而移動和合並可能是移動2步或更多步。這不是一個java問題,而是算法之一。

這是一個使用i和j的雙指針問題,我是記錄你要移動數字的位置,而j是你伸出到最遠的位置以獲取數字。

+0

好的,謝謝!我將如何實現這一點?所以我需要一個嵌套的循環與j從數組的末尾開始? – Sarah

+0

是的。一個嵌套的循環,但實際上仍然是O(n)複雜性。 – richardqiao