【问题标题】:Understanding the logic of an add to an array method了解添加到数组方法的逻辑
【发布时间】:2017-01-26 03:18:43
【问题描述】:

此方法用于插入元素 toAdd 作为数组 arr 的新第一个元素,移动所有当前元素以腾出空间。数组的原始最后一个元素将丢失。该方法没有返回值,如果数组没有元素,它应该没有效果。

public static void insert(int[] arr, int toAdd){

    if(arr.length > 0) {

        for(int i = arr.length - 1; i > 0; --i) {
            arr[i] = arr[i - 1];
        }
        arr[0] = toAdd;
    }
}

我理解关于 if(arr.length > 0) 的部分,这保证我们正在使用一个至少有 1 个元素的数组。其余的逻辑让我感到困惑。为什么设置 i = arr.length,为什么之后设置 a - 1?为什么我 > 0?和--i?

谢谢

【问题讨论】:

  • 试着在一张纸上用一个简单的数组来做算法。它会帮助你理解它。
  • 如果您考虑执行从i = 0arr.length - 1 的算法,请在纸上尝试:您将需要一个额外的变量,否则您会丢失一些信息。向后循环可以摆脱这个变量。
  • @ArnaudDenoyelle 谢谢,向后循环是什么意思?
  • @jun 我的意思是,从i = arr.length - 1 迭代到i = 0(使用i--)而不是从i = 0 迭代到i = arr.length - 1(使用i++)。
  • @ArnaudDenoyelle 我想我现在开始理解它了。谢谢!

标签: java


【解决方案1】:

您正在从数组的最后一个元素浏览到第一个元素,同时将每个元素移动一个。例如,当 i = 3 时,我们将元素 2 移动到位置 3。

但是这种方法行不通。正确的版本是:

public static void insert(int[] arr, int toAdd){
    if(arr.length > 0) {
        for(int i = arr.length - 1; i > 0; i--) {
            arr[i] = arr[i - 1];
        }
        arr[0] = toAdd;
    }
}

--i 在使用之前减少i 的值,所以它应该是i--i 应该从arr.length 开始,否则你不会移动最后一个元素。

【讨论】:

  • arr[i] = arr[i - 1];这很像说将原始数组分配给每个人,但后退一步(即 - 1 步)。因此,每个人的索引都被交易/交换为恰好进行它的那个,直到数组索引为 0,这就是我们直接将其放入的时候。
【解决方案2】:

arr.length 将返回数组中元素的数量。如果您有一个包含索引为 0、1 和 2 的元素的数组,它将返回“3”。问题是数组索引包含在0,所以你需要从长度中减去1才能得到数组中最后一个元素的有效索引。 (即 3 - 1 = 2 并且 2 是最后一个元素的真正索引)

循环使用i > 0,因为索引i 被'--i' 递减(即i = i -1)。因此,循环从数组中的最高元素(长度 -1)开始,向下计数到最低元素(索引 0)。

最后,将toAdd 分配给 0 的行应该在 for 循环之外。

【讨论】:

  • 谢谢。如果我理解, arr.length 将通过计算每个占用的索引每次生成数组中的元素总数。如果我们有 0、3、2。那么 1 + 1 + 1 = 3。现在,由于我们知道数组的总长度,我们可以使用该信息来查找最后一个索引号是什么。由于 arr.length 将其视为人类的 1、2、3、4。然而,计算机在 0、1、2、3、4 处计数。那么 arr.length 总是一个接一个,所以我们必须从 arr.length 中删除一个,以获得正确的最后位置,因为计算机已经计算过了。
  • 所以 arr.length 确实给出了正确的元素数量,但是 arr.length 也很有用,因为我们可以通过考虑计算机计数 0,1 的事实来使用它来获取最后一个索引,2,3,4 和 arr.length 计数 1,2,3,4 是正确的,因为 1,2,3,4 将始终计算正确的元素数量。通过知道 arr.length 始终领先于计算机的计数,将它用作获取最后一个索引的工具非常棒。所以我们使用通过 arr.length 确定的信息来获取正确的最后一个索引的位置编号。
  • 或者说,arr.length 总是比计算机计算索引的方式早一个。并且知道我们可以减去一个来得到计算机如何计算索引。 - 1 就像一种调整它以生成正确的最后一个索引的方法,就像计算机拥有它一样。
【解决方案3】:

为什么要设置 i = arr.length 和 --i?

它是i = arr.length-1,这是数组的最后一个索引。您必须开始向后循环移动元素(--ii-- 也可以),否则您将在移动它们之前覆盖元素。

为什么我 > 0?

arr[0] = toAdd; 应该在循环之外并且对于arr.length == 0 会失败。

您可以简化为:

public static void insert(int[] arr, int toAdd){
    if(arr.length > 0) {
        for(int i = arr.length - 1; i > 0; --i)
            arr[i] = arr[i - 1];
        arr[0] = toAdd;
    }
}

【讨论】:

  • 谢谢!如果有 6 个元素如下所示,那么它是否会在 for 循环中:6 - 1 = 5; 5 > 0; 5 - 1 = 4 4 - 1 = 3; 3 > 0; 3 - 1 = 2 2 - 1 = 1; 1 > 0; 1 - 1 = 0 0 - 1 = -1; -1 > 0 循环结束?
猜你喜欢
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 2015-05-14
  • 2013-11-15
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
相关资源
最近更新 更多