我对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]);
}
问题是:
它没有完全合并,或者由于某种原因它只移动和合并一次?我想知道我做错了什么,所以我可以学习,谢谢!
拜托,有人可以帮我吗?我真的很感激...谢谢!
答案 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]