簡體   English   中英

移動和合並數組中的元素?

[英]Moving and merging elements in array?

我對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}變成{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步移動,而移動和合並可能是2步或更多步。 這不是Java問題,而是算法問題。

這是一個使用i和j的兩點式問題,i是記錄您要將數字移入的位置,j是您最遠可以獲取數字的位置。

看來您需要先移至最前,然后合並元素,然后再移至最前。 合並比較容易實現,甚至檢查數組中的索引; 如果兩個相鄰的元素相等,則將其乘以2,然后將另一個設置為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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM