我知道这个循环会打印{5,1,2,3,4}。 这里的问题是下面的线如何工作?
values[i + 1] = values[i];
根据我的理解,在第一个循环期间,i = 3.因此它将是值[3 + 1] =值[3],这意味着在第4个索引上将有3个元素。这显然是错误,因为输出不同,代码的工作方式不正确。
int[] values = new int[]
{1, 2, 3, 4, 5};
int temp = values[values.length - 1];
for (int i = values.length - 2; i >= 0; i--)
{
values[i + 1] = values[i];
}
values[0] = temp;
System.out.println(Arrays.toString(values));
代码将数组的元素向右移动,并将最右边的元素移动到最左边的位置。
请向我解释因为我很困惑。谢谢。
答案 0 :(得分:1)
他们的关键是观察values
在整个循环过程中的变化。由于这不是针对特定语言的,因此让我们在JavaScript中查看它,以便我们可以在现场运行它(我还将values
更改为v
以缩短消息,以便他们不会t wrap):
var msg;
var v = [1, 2, 3, 4, 5];
var temp = v[v.length - 1];
for (var i = v.length - 2; i >= 0; i--)
{
msg = "Replacing v[" + i + " + 1] with v[" + i + "]: " + JSON.stringify(v);
v[i + 1] = v[i];
msg += " => " + JSON.stringify(v);
console.log(msg);
}
msg = "Replacing v[0] with temp: " + JSON.stringify(v);
v[0] = temp;
msg += " => " + JSON.stringify(v);
console.log(msg);
所以
5
)抓取到temp
中,以便日后再使用values[i + 1]
)替换为第四个值(values[i]
),将1, 2, 3, 4, 5
更改为1, 2, 3, 4, 4
1, 2, 3, 4, 4
更改为1, 2, 3, 3, 4
1, 1, 2, 3, 4
temp
放在首位,为我们提供最终结果5, 1, 2, 3, 4
答案 1 :(得分:0)
values = [1, 2, 3, 4, 5]
您选择values[4]
并将values[3] = 4
放在那里,所以现在values[4] = 4
。你在这里不明白的是什么?我想你忘记了数组从0
而不是1
开始编号的事实。
答案 2 :(得分:0)
我认为你忽略了这两个陈述:
int temp = values[values.length - 1];//Here temp = 5, last index element of your array
和
values[0] = temp;// here 1 will be replaced by 5
由于在循环中最后一个元素丢失,它们将它存储在临时变量temp pre-loop中。循环完成后,将第4个索引替换为3rd,将3rd替换为2nd,将2nd替换为1st,将第1个替换为第0个索引元素。
循环完成后,您的数组看起来像这样:
[1,1,2,3,4]
现在第0个索引元素被temp替换,temp是数组的原始第4个索引。
现在数组将是[5,1,2,3,4]
现在有道理吗?
P.S:我建议你通过在两者之间加入更多的println语句进行调试,以检查发生了什么。 我的建议是在您的代码中进行以下操作以便更好地理解:
System.out.println(Arrays.toString(values));
values[0] = temp;
System.out.println(Arrays.toString(values));