在数组

时间:2015-08-02 07:00:07

标签: java arrays

我正在尝试将数组拆分为oddeven个数字。请注意,在最终结果中排序数字无关紧要。我正在编译代码,输出包含一些bug。我的代码正确排列了odd个数字,而even数字给了我一些麻烦。 COuld smb请帮我解决even号码的安排?提前谢谢!

基本上,我在数组的左侧安排odd个数字,并在开头有oddPos = 0个数字; even数字位于右侧,定位从数组evenPos = myArray.length - 1的最末端开始。

public class EvenOddArray {

    public static void main(String[] args){

        int[] myArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};


        int oddPos = 0;
        int evenPos = myArray.length - 1;

        for(int i = 0; i < myArray.length; i++){
            if(myArray[i] % 2 == 0){
                myArray[evenPos] = myArray[i];
                evenPos--;
            }
            else{
                myArray[oddPos] = myArray[i];
                oddPos++;
            }
        }

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

输出:

1 3 5 7 2 4 6 6 4 2 

4 个答案:

答案 0 :(得分:3)

int current = 0;
int evenPos = myArray.Length - 1;
while (current < evenPos) {
    if (myArray[current] % 2 == 0) {
        swap(myArray, evenPos, current);
        evenPos--;
    } else {
        current++;
    }
}

一个挤压的搞笑版本:

for (int curPos=0, evenPos=myArray.length-1; curPos < evenPos;)
    if (myArray[curPos] % 2 == 0)
        swap(myArray, evenPos--, curPos);
    else
        curPos++;

更有趣的版本:

for (int curPos=0, evenPos=myArray.length-1; curPos < evenPos;)
    swap(myArray, curPos, myArray[curPos]%2==0 ? evenPos-- : curPos++);

<强>解释

  

当数字为奇数时,您不必交换值。只有你   增加现有的柜台。

     

你也不能使用for循环计数器作为数组的索引。至   不要错过被交换到柜台索引的数字   处理。这是其他答案没有涉及的错误。

答案 1 :(得分:2)

实际上,在阅读时,您正在编辑相同的myArray数组。所以会发生什么,

在循环的第6次迭代中,将{6}插入myArray[7]位置。因此,在第7次迭代期间,当您阅读myArray[7]时,它是6.不是8.因为,您在上一次迭代中已经过了8次写入。

因此,使用单独的数组来保存结果。希望你明白这一点。

你可以这样做,

    int[] myArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int[] resultArray = new int[myArray.length];
    int oddPos = 0;
    int evenPos = myArray.length - 1;

    for(int i = 0; i < myArray.length; i++){
        if(myArray[i] % 2 == 0){
            resultArray[evenPos] = myArray[i];
            evenPos--;
        }
        else{
            resultArray[oddPos] = myArray[i];
            oddPos++;
        }
    }

答案 2 :(得分:1)

让我们看看for循环的每次迭代会发生什么。

  • 原文:1 2 3 4 5 6 7 8 9 10
  • 1st Iter:1 2 3 4 5 6 7 8 9 10
  • 2nd Iter:1 2 3 4 5 6 7 8 9 2
  • 3rd Iter:1 3 3 4 5 6 7 8 9 2
  • 4th Iter:1 3 3 4 5 6 7 8 4 2
  • 5th Iter:1 3 5 4 5 6 7 8 4 2
  • 6th Iter:1 3 5 4 5 6 7 6 4 2
  • 7th Iter:1 3 5 7 5 6 7 6 4 2
  • 8th Iter:1 3 5 7 5 6 6 6 4 2
  • 9th Iter:1 3 5 7 5 4 6 6 4 2
  • 10th Iter:1 3 5 7 2 4 6 6 4 2

如您所见,您正在修改阵列&#34; inplace&#34;。您正在修改数组而不使用所有值。例如,看看9,它在被访问之前就被覆盖了。所以,你的算法是错误的。

建议:

  • 使用新数组保存结果,如tibzon的回答
  • 使用交换而不是覆盖。你必须相应地更新你的算法。我打算提供一个。但是Murenik已经提供了一个。

答案 3 :(得分:0)

这是我的优化版本,与@ hasan83版本相比,它使用了大约一半的掉期。

    int n = myArray.length;
    int oddPos = 0;
    int evenPos = n - 1;
    while (true) {
        while (oddPos < n && myArray[oddPos] % 2 == 1) {
            oddPos++;
        }
        while (evenPos >= 0 && myArray[evenPos] % 2 == 0) {
            evenPos--;
        }
        if (oddPos >= evenPos) break;
        swap(myArray, oddPos, evenPos);
    }