【问题标题】:Iterate a 2D slice of integers diagonally in go在go中对角迭代整数的二维切片
【发布时间】:2022-01-22 12:28:41
【问题描述】:

什么是对角地遍历整数的二维切片的惯用方式。是负对角线还是正对角线?

这是一个带有 2d 网格设置的游乐场。 https://go.dev/play/p/Cpxg4a5HvrD

【问题讨论】:

    标签: go


    【解决方案1】:

    如果x == y,或者在本例中为i == j,那么它就是对角线。

    func main() {
        size := 4
        board := make([][]int, size)
        for i := range board {
            board[i] = append(board[i], make([]int, size)...)
        }
        for i, row := range board {
            for j := range row {
                board[i][j] = rand.Intn(9)
                if i == j {
                    log.Println("diagonal:", board[i][j])
                }
            }
        }
        for _, row := range board {
            fmt.Println(row)
        }
    }
    

    那会打印出来

    2021/12/21 01:33:59 diagonal: 5
    2021/12/21 01:33:59 diagonal: 6
    2021/12/21 01:33:59 diagonal: 5
    2021/12/21 01:33:59 diagonal: 8
    [5 6 2 2]
    [4 6 7 8]
    [4 6 5 7]
    [3 2 4 8]
    

    如果你想要不同的对角线,你可以偏移其中一个轴,例如x == y+1,或i == j+1

    那会打印出来

    2021/12/21 01:38:07 diagonal: 4
    2021/12/21 01:38:07 diagonal: 6
    2021/12/21 01:38:07 diagonal: 4
    [5 6 2 2]
    [4 6 7 8]
    [4 6 5 7]
    [3 2 4 8]
    

    对于反对角线,需要使用len(board) - i,即

    for i, row := range board {
        for j := range row {
            board[i][j] = rand.Intn(9)
            if len(board)-i == j {
                log.Println("diagonal:", board[i][j])
            }
        }
    }
    

    打印

    2021/12/21 01:57:30 diagonal: 8
    2021/12/21 01:57:30 diagonal: 5
    2021/12/21 01:57:30 diagonal: 2
    [5 6 2 2]
    [4 6 7 8]
    [4 6 5 7]
    [3 2 4 8]
    

    【讨论】:

    • 我希望看到“负”对角线的一次迭代:例如:[2] [2 8] [6 7 7] [5 6 7 8] [4 6 4] [4 2] [3] 和一个“阳性” [5] [6 4] [2 6 4] [2 7 6 3] [8 5 2] [7 4] [8]
    猜你喜欢
    • 1970-01-01
    • 2014-01-31
    • 2014-04-14
    • 2023-01-08
    • 2011-09-19
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多