【问题标题】:Convert ONE two-dimensional array into TWO one-dimensional arrays将一个二维数组转换为两个一维数组
【发布时间】:2011-12-15 12:35:06
【问题描述】:

您可能对我的要求感到奇怪,但这是真的,将 1 two-dimensional array 转换为 2 one-dimensional arrays

这是我的老师问的,他说他会给回答这个(我认为,棘手的)问题的人一个完美的分数。我很乐意将任何 2 维或 n 维数组转换为一个一维数组。但是他说的是2,所以我觉得肯定跟第二个数组有关系。而且,他没有说明什么类型的数组(int、String 或 object),所以我认为必须使用任何类型的二维数组来完成。

如果这里没有人弄清楚他想要什么,我会回答他:转换为一维数组,并将第二个保留为空(或让它没有元素)。但我认为对于这样一个棘手的问题,这不是一个好的答案。

编辑:这是我老师的问题,逐字逐句(他只是在课程结束时用语音提问,而不是在教科书中,作为奖励问题(...一个不错的奖励)):给定 a 2-dimensional array,将其转换为 2 1-dimensional arrays。

我不知道Java和C#中的[][]是否考虑2-dimensional array,但是C#确实有[,],它是二维数组。我们正在研究计算机算法,没有目标 IDE 或语言。

EDIT2:我给他发了邮件,他拒绝提供更多信息(他说如果我有比他们更多的信息对其他人不公平),他也没有提供任何关于 jagged数组的想法。在他的回复中唯一有用的是:让 [][] 被视为2-dimensional array

【问题讨论】:

  • 鉴于 Java 并没有真正拥有这样的二维数组(它有数组的数组),因此很难给出一个好的答案。提出一个精确的问题真的很有帮助——最好是样本输入和预期输出。我认为这个问题没有必要像“没有明确说明”那样“棘手”。
  • 这听起来更像是一个横向思维难题,而不是一个编码问题。即,一旦你得到一些额外的信息,他使用了什么技巧使他所说的变得有意义。
  • 您能否发布(或链接到)讲师问题的确切措辞?
  • @W.N.:那么我担心这个问题的措辞太糟糕了,无法给出有意义的明确答案。下次联系你的老师了解更多详情:)
  • 一个想法是在一个数组中逐行和第二列逐列保持,一些在两次通过(第一次通过水平,第二次通过垂直)中工作的成像算法可能有用,我认为这将是更合乎逻辑的解释,而不是保存行开始的索引(因为你可以很容易地计算它们)。

标签: c# java arrays algorithm


【解决方案1】:

我会咬人的。通过简单地一致地读取和写入,可以将整个二维数组展平为两个一维数组中的第一个。 IE。将第 1 行然后第 2 行等依次存储在第一个数组中。每当您移动到下一行时,将下一个单元格(第一个一维数组的)的索引存储在第二个一维数组中,这实际上将成为一个行索引表。

正如上面 Jon Skeet 所说,这不是一个非常明确的问题;也许有了明确的信息,我们可以更好地帮助您。

【讨论】:

  • 可能值得注意的是,二维数组不需要第二个数组(因为行长度是恒定的),但锯齿状数组则需要它。
  • 你不需要行索引数组,因为它可以为二维数组计算(它不是锯齿状的)
  • 我已编辑我的问题以添加更多信息。我认为您的解决方案中不需要第二个数组,因为我们可以通过数学运算符访问 1-dimensional array
  • 只需阅读此问题的第一条评论。嘿,也许你是对的!如果(例如):a[0] = new int[] {1, 6, 9}a[1] = new int[] {1},我们必须使用第二个数组进行索引!
  • 正如乔治所说,不过.. 如果您的数组真的看起来像这样:{1,2,3,4},{1,2},{1,2,3,4,5}并适合 3x5 数组,那么您需要存储索引。
【解决方案2】:

如果我正确理解你的问题

这很容易 m8...

这只是一个算法问题......不是特定于编程语言的......

你可以这样做:

  1. 一个数组保存值
  2. 第二个数组保存键
  3. 尝试在第二个数组中找到解决方法,以了解您拥有哪些键..

    For example:
    array_1: v0 v1 v2 null v3 v4 v5 null v6 v7 v8 null
    array_2: 0  1  2  newR 0  1  2  newR 0  1  2  newR
    

您也可以在一个数组中表示它...但是您需要一种特定的算法来确定您何时位于矩阵的 Y 上。

问题是你不会立即从内存中访问数据。这就是为什么会有二维数组

另一种方式:

  1. 将值保留在数组 1 中
  2. 将键作为字符串保存在第二个数组中,如下例所示:

    array1: value1 value2 value3 value4 value5
    array2: 0,0    0,1    1,0    1,1    2,0
    

有很多算法,但我认为您不会找到比二维数组更好的算法...

当您照顾它们时,您的性能会降低.. ofc.. 除非您将它们保存在哈希表中.. 哈希 0,0 并添加为哈希表中的键并将指定的值添加到该键。然后你会寻找关键的“0,0”...

【讨论】:

    【解决方案3】:

    以行优先或列优先的顺序展平二维数组,将其存储在一维数组中。将数组的形状{n, m} 存储在另一个一维整数数组中。给定二维值数组中元素的索引,您可以使用形状计算一维值数组中的索引。

    这两种表示是同构的,并且都允许在恒定时间内查找值。它也类似于二维数组在内存中的表示方式。

    【讨论】:

    • 不客气!如果您编写了任何代码来演示该方法,我希望您为将来看到您的问题的任何人编辑它。
    【解决方案4】:

    我猜你想在不丢失任何信息的情况下将 2 维数组(类型为 RelevantType[,])转换为 2 个数组(类型为 SomeTypeA[]SomeTypeB[])?

    这不是很困难: 让第一个数组为RelevantType[] 类型,第二个为int[] 类型,将二维数组的内容复制到第一个数组中,将它的第一个索引复制到第二个数组中,就完成了。

    【讨论】:

    • 他没有说数组类型,所以我想我必须将someType[, ] 转换为 2 someType[]s,是的,你说对了一件事:没有信息丢失。