今天早些时候,我的教授给出了在不返回新数组的情况下反转数组的课堂作业,他希望(但没有告诉我们)在不添加和追加元素的情况下这样做。我想出的解决方案如下:
ArrayList<Double> al = new ArrayList<Double>();
al.add(5.00);
al.add(1.00);
al.add(4.00);
al.add(2.00);
al.add(3.00);
for (int i = al.size()-1; i >=0; i--)
{
double temp = al.get(i);
int zeroUp = ((al.size()-1)-i);
al.set(zeroUp, temp);
}
System.out.println(al.toString());
我注意到prints: [3.0, 2.0, 4.0, 2.0, 3.0].
每次都中途停止,但是我不明白为什么。 Set()不会删除其值将被发送到传递的索引的元素,对吗?我在某个随机网站上发现正确答案是:
for (int i = al.size() / 2; i >=0; i--)
{
double temp = al.get(i);
int zeroUp = ((al.size()-1)-i);
al.set(i, al.get(zeroUp));
al.set(zeroUp, temp);
}
System.out.println(al.toString());
输出:[5.0、1.0、4.0、2.0、3.0]
再次,为什么我们必须将size()
除以2并为我标记的元素定义值?
答案 0 :(得分:2)
因为要在原位反转数组 。您认为Set()
不会删除其值要发送到传递的索引的元素是正确的。
因此,您拥有数组[5,1,4,2,3]。一旦函数完成一半,数组就是[3,2,4,2,3]。请注意,中间元素两侧的元素如何互为镜像。这意味着当您尝试将下半部设置为上半部时,上半部已经等于下半部。
换句话说,为了反转数组,您只需要将前一半与后一半交换即可。 [5,1,4,2,3]-> [3,1,4,2,5]-> [3,2,4,1,5]
我不知道这是否可以说得很清楚,但我希望它会有所帮助