将每个零移动到给定的整数数组的右侧

问题描述 投票:-1回答:1

我正在尝试将每个零移动到给定整数数组的右侧。但是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);
    }
}
java
1个回答
2
投票

我无法提供确切的代码,但是您应该查找荷兰国旗问题,并尝试从中建立您的解决方案。要点是,每当看到0时,就将其与最右边的元素交换,并在可行时移动指针r--并继续执行直到您的左指针ll < 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]

© www.soinside.com 2019 - 2024. All rights reserved.