我正在尝试将每个零移动到给定整数数组的右侧。但是while循环无法正常工作,并且输出与输入数组相同。我该如何解决?输入:[5,4,0,3,2,0,1,7,0]预期输出:[5,4,7,3,2,1,0,0,0]
public class Examp167 {
public static void exchange(int[] array){
for (int j=0; j<array.length; j++){
if (array[j]==0){
while (array[j] != 0) {
for (int i=array.length-1; i!=j ; i--) {
int temp = array[j];
array[j] = array[i];
array[i] = temp;
}
}
}
System.out.print(array[j]+ " ");
}
}
public static void main(String[] args) {
int[] a = new int[] {5,4,0,3,2,0,1,7,0};
exchange(a);
}
}
我无法提供确切的代码,但是您应该查找荷兰国旗问题,并尝试从中建立您的解决方案。要点是,每当看到0时,就将其与最右边的元素交换,并在可行时移动指针r--
并继续执行直到您的左指针l
为l < r
。
伪代码将是这样的
int l = 0; int r = array.size() - 1;
while(l < r) {
if(array[l] == 0) swap(array[l], array[r--]);
else l++;
}
它应该工作,但是我还没有考虑周全,它至少应该为您提供解决问题的方法。
这是Java中的样子:
public static void exchange(int[] array){
int l = 0;
int r = array.length;
while (l < r) {
if(array[l] == 0) {
r--;
int temp = array[l];
array[l] = array[r];
array[r] = temp;
}
else {
l++;
}
}
System.out.println(Arrays.toString(array));
}
public static void main(String[] args) {
int[] a = new int[] {5,4,0,3,2,0,1,7,0};
exchange(a);
}
输出:
[5、4、7、3、2、1、0、0、0]