我想将一个数组从0翻转到索引n,所有翻转的元素都应该反转。

如果我打电话给Flip(A,2)
我希望的结果是

true, false, true , true, false


(将Array部分从0向后选择2,并将值取反)

public class test{

public static void main(String[] args) {
    Boolean[] A = { false, true, false, true, false };

    A = Flip(A, 4);

    print(A);
}

public static Boolean[] Flip(Boolean[] A, int n) {
    Boolean[] Atemp = A;

    for (int i = 0; i <= n; i++) {
        Atemp[i] = !A[n - i];
    }

    return Atemp;
}

public static void print(Boolean[] A) {
    for (Boolean b : A)
        System.out.println("" + b);

    System.out.println();
}

}


但我得到的结果是

true,false,false,true,false


是我的代码中的错误(最有可能)
或是否涉及Java特定的故障。

谢谢你的帮助

最佳答案

您的代码有几个问题:


它不仅翻转数组,而且反转数组。猜猜这只是规范中的一个错误。
您的代码尝试就地反转数组,但未正确实现。
您的代码具有n作为包含的上限,但是规范指出它应为排除的。


关于第1点:假设这实际上只是规范的问题,我们可以简单地忽略这一点。

第3点:只需更改以下内容的for循环

for (int i = 0; i <= n; i++)




for (int i = 0; i < n; i++)


获得所需的行为。

第2点:
这里我们可以采取几种方法:实际上实现就地反转:

public static Boolean[] Flip(Boolean[] A, int n) {
    for (int i = 0; i < n / 2.0; i++) {
        boolean tmp = A[i];
        A[i] = !A[n - i - 1];
        A[n - i - 1] = !tmp;
    }

    return A;
}


或创建数组的副本并在该副本内取反:

public static Boolean[] Flip(Boolean[] A, int n) {
    Boolean[] Atemp = Arrays.copyOf(A , A.length);

    for (int i = 0; i < n; i++) {
        Atemp[i] = !A[n - i - 1];
    }

    return Atemp;
}


无需使用Boolean[]。只需使用原始类型boolean[]

未来的提示:实际上可以使用调试器进行调试,或者如果您愿意,只需更改代码以反转int[]而不是boolean[]即可对其进行调试。只需使用{1, 2, 3, 4, 5, ...},单个元素的作用就很明显了。

关于java - 翻转阵列部分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37380638/

10-12 00:27
查看更多