当前位置: 首页 > 面试题库 >

如何更快速地转置数组?

束福
2023-03-14
问题内容

不久前我问过类似的问题。有人问我怎样才能变成这样的数组:

[[1,2,3],[4,5,6],[7,8,9]]

对此:

[1,2,3,4,5,6,7,8,9]

但是现在我想把相同的数组变成这个:

[1,4,7,2,5,8,3,6,9]

假设所有子数组具有相同的长度。

如果您尚未注意到,结果中的前三项就是这三个子数组中的第一项。结果中的第四,第五和第六项是每个子数组的第二项。

如果您仍然不了解,也许这会有所帮助:

原始数组:

[
    [1,2,3],
    [4,5,6],
    [7,8,9]
]

结果:

[
    1,4,7,
    2,5,8,
    3,6,9
]

此刻,我有这个:

func flatten(array: [[Int]]) -> [Int] {
    var flat = [Int]()
    for i in 0..<array[0].count {
        for subarray in array {
            flat.append(subarray[i])
        }
    }
    return flat
}

我认为那不是很花钱。如何快速进行此操作?

为了避免成为XY问题,这就是我要这样做的原因。

我正在开发一个棋盘游戏。我正在使用HLSpriteKit的棋盘游戏HLGridNode(基本上是一堆正方形的网格状布局)。要编辑网格节点的内容,我需要传递一个Sprite节点的1D数组,而不是2D数组。

为了使生活更轻松,我将模型对象存储在2D数组中。这样,我可以通过以下操作从左到左引用5个正方形,从上到顶部引用2个正方形。

modelObjects[5][2]

如果我使用展平2D数组.flatMap { $0 }并将结果传递到网格节点,则它modelObjects[5][2]看起来将是从左侧2个正方形和从顶部5个正方形。

这不是重复这个,因为这个问题似乎有数组与工作的明确的数量。尽管我可以将2D数组放入一个循环中并执行这些操作enumerate().map{...},但这似乎是一个漫长的过程。我认为使用2D阵列必须做得更简单。


问题答案:

这里有一个改进的影子of的答案:

extension Collection where Self.Iterator.Element: RandomAccessCollection { 
    func transposed() -> [[Self.Iterator.Element.Iterator.Element]] {
        guard let firstRow = self.first else { return [] }
        return firstRow.indices.map { index in
            self.map{ $0[index] }
        }
    }
}

let matrix = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
]
matrix.transposed().forEach{ print($0) }


 类似资料:
  • 问题内容: 我一直在使用sort()函数,但它混合了相对顺序。 这就是我的代码的样子。 Swift API表示: 排序算法不稳定。不稳定排序可能会更改比较相等的元素的相对顺序。 如何更改此值,以使相对顺序保持与以前相同? 问题答案: 从这里获取:https : //medium.com/@cocotutch/a-swift-sorting- problem-e0ebfc4e46d4

  • 问题内容: 我如何获得本地IpAddress? 当我使用该功能时,我将无法再继续使用。我不能使用该功能。 是否有其他方法可以执行此操作,或者我是否以错误的方式进行操作? 问题答案: 在讨论中发现,OP需要Mac上的接口地址,而不是我最初想的那样在iOS设备上。问题中引用的代码将检查接口名称“en0”,它是iPhone上的WiFi接口。在Mac上,改为检查任何“正在运行”的界面更有意义。因此,我重写

  • 问题内容: 我知道如何在Java中执行此操作,但是找不到Java的ByteBuffer的快速等效项,因此也找不到它的.putDouble(double value)方法。 基本上,我正在寻找这样的功能: 问题答案: typealias Byte = UInt8 但是结果与您的期望相反(由于字节顺序): 添加: 对于Xcode8 / Swift3.0: 对于Xcode8.1 / Swift3.0.1

  • 问题内容: 如何快速将PFFile转换为UIImage? 在这段代码中,应用程序正在从解析中获取文件,现在我希望它显示在UIImageView上,但是我得到一个错误… 这是我的代码… 问题答案: PFFile是任何文件的解析表示。要获取“真实”文件(图像),您需要调用。试试吧:

  • 问题内容: 一个可以被转换为使用,但有在新的没有这样的方法(与夫特1.2引入)。仍然可以通过将Swift Set转换为NSSet并使用该方法来完成,但这并不是最佳选择。 问题答案: 您可以简单地使用给定Swift的所有元素创建一个数组 之所以有效,是因为符合协议,并且可以使用序列进行初始化。例:

  • 问题内容: 我想优化此代码: 事情是,我不知道如何读取bufferedReader的内容并将其复制到String中,比我上面的速度更快。我需要花费尽可能少的时间。谢谢 问题答案: 在循环中使用字符串连接是 在 经典的性能杀手(因为字符串是不可变的,整个越来越大的字符串被复制为每个连接)。改为这样做: