[英]Moving and merging elements in array?
我對Java還是很陌生,但已經掌握了基礎知識...
因此,我有一個4個整數的數組,需要將其移到數組的前面,或者如果它們相等,則將它們合並:
這是我到目前為止的內容:
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]);
}
問題是:
它沒有完全合並,還是由於某種原因僅移動並合並了一次? 我想知道我在做錯什么,所以我可以學習,謝謝!
拜托,有人可以幫我嗎? 我真的很感激...謝謝!
問題在於代碼中的移動和合並僅是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.