有人会解释以下代码中每行的作用吗?我基本上和-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;
答案 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