【问题标题】:How to count up X times after an element is found in a 2d Array in java在java中的二维数组中找到元素后如何计数X次
【发布时间】:2017-04-18 17:24:55
【问题描述】:

我对 java 还很陌生,我只是想知道如何从二维数组中的所需元素中找到一个元素,X 个空格。这是一个例子来解释我所问的是否没有意义:

String[][] array = {{"1", "5", "7"},
                    {"8", "12" "15"},
                    {"2", "21", "16"}
                    };

假设所需的字符串是“5”,我知道如何找到它。现在假设用户是否想向上计数 3 次(从 0 开始计数)。我如何让它返回 15 的值?

【问题讨论】:

  • 如果我们将二维数组转换为一维数组,那么我们可以轻松找到其中的任何元素。
  • 向上是什么意思,你如何期望 15 成为输出?也向我们展示你尝试过的东西。

标签: java arrays multidimensional-array iteration


【解决方案1】:

您正在尝试找到一种算法,该算法可以逐步遍历数组中的任意数量的槽。使用 2D 数组(假设遍历数组的步骤可以循环回到数组的开头,如果您到达数组的末尾),像这样的问题会尖叫“模数”。

运行几个示例,您就可以开始构建算法了。对于数组的列,算法很简单

(currentColumn + numberOfSteps) % sizeOfRow

将此算法与您的示例一起使用,从索引 [0][1] 开始,并将相应的值代入上述等式,您将得到以下结果:

columnIndex = (1+4)%3 = 2

现在你需要想出一个算法来找到对应的行值。对应于行值的算法是:

(currentRow + ((currentColumn + numberOfSteps) / sizeOfRow)) % numberOfRows

请注意,此算法与 Java 中的整数代数一起使用,会从除法中得到整数。这是确定步骤是否会流入下一行或保持在同一行的关键(如果您在第 0 列并采取 2 个步骤,则需要保持在同一行:(0+2) /3 = 0) 插入示例中的值,您会得到以下结果:

rowIndex = 0 + ((1+4)/3)%3 = 0 + 1 = 1

请注意,这些算法假定如果您经过数组中的最后一个槽,您将循环回到数组的开头。通常,当遇到此类问题时,请考虑“取模”并通过一些示例来找到可行的算法。

使用这些算法找到新的索引值:[1][2],您可以从二维数组中检索相应的值。干杯!

【讨论】:

    【解决方案2】:

    在我看来,您的示例中有几个错误:

    • 我觉得“12”后面应该有逗号
    • 上升 3 次(从 0 开始计数)我认为您的意思是上升 4 次,计数 0、1、2、3。它仍然上升 4 次。

    假设我对这两个都是正确的,答案取决于二维数组是矩形(所有子数组的长度相同,如您的示例中所示)还是参差不齐(例如,{ {1},{ 2, 4, 6} }。我假设是矩形的,因为这就是您的示例中的内容(此外,它更简单)。

    你提出的问题的基本部分是:给定数组数组的元素的索引'm,n',找到 m2 和 n2,它们是在它上面 X 位置的元素的索引。在您的示例中,m=0 和 n=1,X = 4,并且您要计算 m2 应该是 1,n2 应该是 2。我们还需要内部数组的长度;我们可以称之为'len',它等于array[0].length。

    我认为最好的方法是分三个步骤:

    1. 计算 m,n 的单变量索引,将数组视为串出的一维数组。我们称这个索引为“i”;在您的示例中,我将从 1 开始(“1”在位置 0,“5”在位置 1,“7”在位置 2,“8”在位置 3,“12”在位置 4, “15”在位置 5)。通常,您会使用语句“i = m*len + n;”来执行此操作。
    2. 将 X 添加到 i 以查找新的单变量索引。在您的示例中,我们将 X=4 添加到 i=1 并且您得到 i=5,这就是所需的“15”所在的位置。
    3. 将“i”的新值转换为 m2 和 n2。我们将使用 / 和 % 来做到这一点:m2 = i/len 和 n2 = i%len。在您的示例中,根据需要,m2 = 5/3 = 1,n2 = 5%3 = 2。

    所以,整个序列是:

    i = m*len + n;
    i += x; // I switched to lower case to conform to Java standards
    m2 = i/len;
    n2 = i%len;
    

    我希望这是有道理的。如果您需要处理参差不齐的数组,请告诉我们。该解决方案会更慢且更复杂。

    【讨论】:

      猜你喜欢
      • 2019-01-25
      • 1970-01-01
      • 2015-02-23
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多