数组java中的交换值

时间:2014-04-29 23:27:29

标签: java arrays

我在这里有一个问题。 我试图在这个数组中找到第一个缺失的正数。 比如[1,2,0]答案应该是3。 代码是:

public static int firstMissingPositive(int[] A) {
        // Start typing your Java solution below
        // DO NOT write main() function
        for(int i=0; i<A.length; i++){
            while(A[i]>0 && A[i]<=A.length && A[i]!=i+1 && A[i]!=A[A[i]-1] ){

                 int temp=A[A[i]-1];
               A[A[i]-1] = A[i];
               A[i]=temp;
            }
        }
        int index=0;
        while(index<A.length && A[index]==index+1) index++;
        return index+1;

  }

这很有效。 而当我像这样改变代码中的交换函数时:

int temp=A[i];
A[i]=A[A[i]-1];
A[A[i]-1]=temp;

这次代码需要很长时间才能编译而不能正常工作。为什么? 解决方案就在这里。只是询问里面的交换功能。 您的算法应该在O(n)时间运行并使用恒定空间。 更新:@Bohemian你的答案是完全错误的!

2 个答案:

答案 0 :(得分:3)

我想你想要这个:

int temp=A[i];
A[i]=A[i-1];
A[i-1]=temp;

您正在将数组值与索引混合。虽然从技术上来说你的代码是编译的,因为你的数组包含int,但它不会做任何有用的事情,并且可能会因ArrayIndexOutOfBoundsException而爆炸。

您可以考虑重命名数组变量以符合Java命名标准;以小写字母开头,例如numbers


作为思考的食物,我会像这样对数组进行排序:

Arrays.sort(A);

答案 1 :(得分:1)

如果我们观察到第二行和第三行A[i]在第二行被更改并在第三行被重用。所以这会引发错误。

改为使用:

temp = A[i];
A[i] = A[A[i]-1];
A[temp-1] = temp;

temp代替A[i]将完美无缺。