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[0]);
    System.out.println(row[1]);
    System.out.println(row[2]);
    System.out.println(row[3]);
}

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!

2 answers

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