# Moving and merging elements in array?

 Refresh December 2018 Views 49 time
2

I'm quite new to Java but I've got the basics...

So I have an array of 4 ints which I need to move to the front of the array, or merge them if they are equal so:

• {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} etc...

Here's what I have so far:

``````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);
System.out.println(row);
System.out.println(row);
System.out.println(row);
}
``````

The problem is:

• {0,1,0,2} becomes {1,0,2,0}
• {0,2,0,2} becomes {2,0,2,0}
• {1,1,3,3} becomes {2,3,3,0}
• {2,2,2,2} becomes {4,2,2,0}

It doesn't merge fully, or it only moves and merges once for some reason? I would like to know what I am doing wrong so I can learn, thanks!

Please, could anyone help me with this? I would really appreciate it... Thanks!

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 является положением вы протянули к дальнему, чтобы получить номер с.