【问题标题】:Reversing ArrayLists: Why must i equal half the size of the list?反转 ArrayLists:为什么我必须等于列表大小的一半?
【发布时间】:2019-03-14 23:11:59
【问题描述】:

今天早些时候,我的教授在课堂上布置了一项在不返回新数组的情况下反转数组的作业,他希望(但没有告诉)我们在不添加和附加元素的情况下这样做。我想出的解决方案如下:

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并为我标记的元素定义一个值?

【问题讨论】:

    标签: java arraylist


    【解决方案1】:

    因为您正在反转数组就地。您认为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]

    我不知道这是否尽可能清楚,但我希望它有所帮助

    【讨论】:

    • 你很快!在我发布这个之后,我将数组写在一张纸上,并立即注意到我从未以任何方式“保存”被覆盖的值。我真的很沮丧,因为我在课堂上没有注意到这一点。我坐在这里拿着我的回答,直到我明白了。我现在完全明白了。谢谢!
    猜你喜欢
    • 2013-05-27
    • 2011-04-29
    • 2011-04-18
    • 1970-01-01
    • 2016-07-03
    • 2023-04-11
    • 2016-04-01
    • 2018-07-26
    相关资源
    最近更新 更多