在Java中反转数组代码说明

时间:2017-11-20 00:14:18

标签: java arrays

有人会解释以下代码中每行的作用吗?我基本上和-1和-i混淆了。

无论如何我们还可以在没有TEMP值的情况下反转数组吗?

for (int i = 0; i < numbers.length / 2; i++) { // why divide by 2
     int temp = numbers[i];
     numbers[i] = numbers[numbers.length - 1 - i];// what this does?
     numbers[numbers.length - 1 - i] = temp;`i];
     numbers[numbers.length - 1 - i] = temp;

2 个答案:

答案 0 :(得分:1)

简单地说,这个循环正在交换数组中值的位置。

例如,取这个数组[1, 2, 3, 4]

循环首先将i处的元素设置为变量temp。 然后,数组末尾的数字减去我们向前移动了多少次迭代/位置(i),设置为数组的当前位置(i )因此取代1。换句话说,它从未被交换的自身中选择最远的元素。在此之后,temp设置为4旧位置的位置。

第一次迭代使数组看起来像[4, 2, 3, 1]

第二次迭代使数组看起来像[4, 3, 2, 1]

阵列现在已反转。但请注意,我们只迭代了数组长度的一半。没有必要继续迭代,如果我们再进一步,我们会得到一个数组越界错误。

-1的原因是因为.length返回从 1 计算的数组中的元素数量

答案 1 :(得分:0)

假设您的数组长度为10,第一次迭代会执行此操作

i = 0

int temp = numbers[0];
numbers[0] = numbers[10 - 1 - 0]; // first value becomes the last value in the array
numbers[10 - 1 - 0]  = temp; // last value becomes the previously first value in the array

2值会一步更改,因此您需要(length / 2)步才能完成工作。

如果要在不使用其他变量的情况下交换两个整数,可以使用xor按位运算符(^

一个例子:

int x = -10;
int y = 125;
x ^= y;
y ^= x;
x ^= y;

有关其背后理论的更多细节on wikipedia