我正在try 将矩阵顺时针旋转90°,特别是使用非就地旋转算法.我想出了这个代码:

func RotateClockWiseNIP(matrix [][]int) (out [][]int) {
    // Create and populate a new out matrix full of zero
    nullRow := []int{}
    为 i := 0; i < len(matrix); i++ {
        nullRow = append(nullRow, 0)
    }
    为 i := 0; i < len(matrix); i++ {
        out = append(out, nullRow)
    }
    fmt.Println(out)
    // Change values accordingly
    为 row := 0; row < len(matrix); row++ {
        为 c := 0; c < len(matrix); c++ {
            fmt.Printf("The matrix element %v %v goes to out element %v %v\n", row, c, c, len(matrix)-1-row)
            out[c][len(matrix)-1-row] = matrix[row][c]
            fmt.Println(out)
        }
    }
    return
}

其 idea 是将每一行作为列放置在新的矩阵中.例如,第一行将是最后一列,第二行将是倒数第二列,依此类推. 现在代码可以工作了,但并不像预期的那样.打印出矩阵[][]int{{1,2},{3,4}的结果会得出以下结果:

[[0 0] [0 0]]
The matrix element 0 0 goes to out element 0 1
[[0 1] [0 1]]
The matrix element 0 1 goes to out element 1 1
[[0 2] [0 2]]
The matrix element 1 0 goes to out element 0 0
[[3 2] [3 2]]
The matrix element 1 1 goes to out element 1 0
[[4 2] [4 2]]

您可以看到,每个赋值都在两行上重复,而不是只在out矩阵中的正确位置重复. 有什么关于为什么会发生这种事的线索吗? 太感谢你们了!

-编辑

好的,显然问题出在第一部分.交换

nullRow := []int{}
    为 i := 0; i < len(matrix); i++ {
        nullRow = append(nullRow, 0)
    }
    为 i := 0; i < len(matrix); i++ {
        out = append(out, nullRow)
    }

为 i := 0; i < len(matrix); i++ {
    out = append(out, []int{})
    为 j := 0; j < len(matrix); j++ {
        out[i] = append(out[i], 0)
    }
}

解决了问题.不过,我就不提这个问题了,因为我真的不能理解第一种方法的错误之处.

推荐答案

nullRow是指向切片的指针.在第一种方法中,out中的每一行都指向相同的切片.因此,所有行都具有相同的值.

Go相关问答推荐

gorm如何声明未自动更新的unix时间戳米尔斯字段

如何使用工作区方法扩展克隆的Golang库

一次打印用户输入的字符串n次

如何解析Go-Gin多部分请求中的 struct 切片

如何修复 Go 中协议缓冲区定义中重新定义的字段?

在 Go 中将元数据从一个 JPEG 复制到另一个

golang / urfave.cli:无法手动设置标志

有没有办法在 Golang 中使用带有 go-simple-mail lib 的代理?

io.Reader 无限循环与 fmt.Fscan

当我的 go build 成功时,如何修复我的 docker build 失败? Dockerfile 包括 go mod 下载

无法从主域访问子域:无Access-Control-Allow-Origin

致命错误 - 所有 Goroutines 都睡着了!僵局

使用自定义处理程序 nats golang 保留订阅方法

Golang - 将 [8] 布尔转换为字节

vs 代码调试 go 测试不通过标志

函数的递归调用以 goroutine 和惯用方式开始,以在所有工作 goroutine 完成时继续调用者

如何在 Unmarshal 中使用泛型(转到 1.18)

Go 赋值涉及到自定义类型的指针

map和struct golang的合并

如何使用 httputil.ReverseProxy 设置 X-Forwarded-For