移动和合并数组中的元素?

时间:2016-05-29 02:35:25

标签: java arrays for-loop

我对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}

它没有完全合并,或者由于某种原因它只移动和合并一次?我想知道我做错了什么,所以我可以学习,谢谢!

拜托,有人可以帮我吗?我真的很感激...谢谢!

2 个答案:

答案 0 :(得分:0)

问题是移动和合并代码只有一步移动,而移动和合并可能是2步或更多步移动。这不是一个java问题,而是一个算法问题。

这是一个双指针问题,使用i和j,我是记录你要移动数字的位置,j是你已经达到最远的位置以获得数字。

答案 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]