【问题标题】:How to get the summation of diagonal lines using higher-order functions?如何使用高阶函数获得对角线的总和?
【发布时间】:2018-10-04 12:35:29
【问题描述】:

考虑以下二维数组:

let array = [
                [11, 2, 4],
                [4, 5, 6],
                [10, 8, -12]
            ]

我想得到的是对角线的总和:

  • 作为firstDiagnal: 11 + 5 + (-12) = 4
  • 作为secondDiagnal:4 + 5 + 10 = 19

我可以使用标准的for-in 循环来实现它:

var firstDiagnal = 0
var secondDiagnal = 0

for i in 0..<array.count {
    firstDiagnal += array[i][i]
    secondDiagnal += array[i][array[i].count - 1 - i]
}

print(firstDiagnal)
print(secondDiagnal)

但是,如果我们尝试使用 higher-order 函数会怎样?比如mapreduce

【问题讨论】:

    标签: arrays swift algorithm higher-order-functions


    【解决方案1】:

    要获得第一个总和,您需要第 i 行的第 i 个元素:

    let firstDiag = array.enumerated().map { $1[$0] }.reduce(0, +)
    

    要获得第二个总和,您需要相同的东西,但列颠倒了:

    let secondDiag = array.enumerated().map { $1.reversed()[$0] }.reduce(0, +)
    

    【讨论】:

    • 哇。不错的答案。 clap clap 我一直认为枚举也会遍历子数组。 掌心
    【解决方案2】:

    首先,您可以编写一个简洁的扩展来从嵌套数组中取出对角线:

    extension Array {
    
        func diagonal<T>(order: Int) -> [T] where Element == [T] {
    
            var order = order
            return self.compactMap {
                guard order >= 0, $0.count > order else {
                    order -= 1
                    return nil
                }
                let output = $0[order]
                order -= 1
                return output
            }
        }
    }
    
    let array = [[1, 2, 3],
                 [4, 5, 6],
                 [7, 8, 9]]
    
    print(array.diagonal(order: 0)) // [1]
    print(array.diagonal(order: 1)) // [2, 4]
    print(array.diagonal(order: 2)) // [3, 5 ,7]
    print(array.diagonal(order: 3)) // [6, 8]
    

    这只是一个简单的沼泽标准归约和求和的例子:

    let fristDiagonal = array.diagonal(order: 0).reduce(0, +)
    let secondDiagonal = array.diagonal(order: 1).reduce(0, +)
    

    【讨论】:

      猜你喜欢
      • 2018-06-20
      • 2019-10-20
      • 2023-03-13
      • 1970-01-01
      • 2020-03-31
      • 2021-05-25
      • 1970-01-01
      • 2020-10-22
      • 2020-08-31
      相关资源
      最近更新 更多