我想将一个数组从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/