如何将所有偶数移到数组前面?

时间:2014-04-02 12:02:07

标签: java arrays

以下是问题 -

给定一个整数数组作为输入,返回一个包含与输入数组中相同数字的数组,但重新排列,以便所有偶数都在前面,而赔率数在后面。请注意,应该保持偶数和奇数的顺序,即如果在输入中出现偶数n1之前的偶数n2,那么在输出数组n1中应该出现在n2之前。奇数也是如此。另请注意,在此问题中,您不应创建任何新数组。

到目前为止所做的工作如下,但我无法获得预期的输出。

public class MoveEvenToFront {

    static int[] testcase1 = {3, 5, 4, 6, 8, 9, 7, 10};

    public static void main(String[] args) {

        MoveEvenToFront testInstance = new MoveEvenToFront();
        int[] result = testInstance.moveEvenToFront(testcase1);
        System.out.print("{");

        for (int i = 0; i < result.length; i++) {
            if (i > 0) {
                System.out.print(",");
            }
            System.out.print(result[i]);
        }
        System.out.print("}");
    }

    public int[] moveEvenToFront(int[] arr) {
        int temp = 0;

        for (int i = 1; i < arr.length; i++) {
            if (arr[i - 1] % 2 != 0) {
                temp = arr[i - 1];
                arr[i - 1] = arr[i];
                arr[i] = temp;
            }
        }
        return arr;
    }
}

测试用例{1,2,3,4,5,6,7,8,10,12}的预期输出为{2,4,6,8,10,12,1,3,5,7}

3 个答案:

答案 0 :(得分:4)

你的算法错了。您正在检查arr[i-1]是否不均匀,并使用arr[i]进行交换。如果arr[i]也是奇数,那么你没有检查它,即使它是奇数,它也会移动到前面。

你能做的是

  • 找到数组中的第一个偶数,并将其与第一个索引交换并递增索引。
  • 然后找到第二个偶数并用第二个索引交换它,继续直到数组结束。

更改方法如下所示:

public int[] moveEvenToFront(int[] arr){
    int temp=0;
    int a=0;
    for(int i=0;i<arr.length;i++){
        if(arr[i]%2==0){

            for (int j=i;j>a;j--){
                temp=arr[j-1];
                arr[j-1]=arr[j];
                arr[j]=temp;
            }
            a++;
        }
    }
    return arr;
}

答案 1 :(得分:3)

直接尝试:

public static Integer[] NUMBERS = {3,5,4,6,8,9,7,10};

public static void main(String[] args) {
    ArrayList<Integer> ints = new ArrayList<>(Arrays.asList(NUMBERS));
    int nextIdx = 0;
    for (int idx = 0; idx < ints.size(); idx++) {
        if (ints.get(idx) % 2 == 0) ints.add(nextIdx++, ints.remove(idx));
    }
    System.out.println(ints);
}

输出:

[4, 6, 8, 10, 3, 5, 9, 7]

答案 2 :(得分:0)

public void moveEvenToFront(){
 int temp=0;
 for(int i=0;i<values.length;i++){
      for(int j=i;j<values.length;j++){
           if(values[j]%2==0){
                temp = values[i];
                values[i] = values[j];
                values[j] = temp;
           }
      }
 }

创建values[]后,解决此问题的关键是确定偶数个位置并使用values[0]进行切换。并增加1,这样偶数就不会消失。希望这会有所帮助。