目标:我一直在使用Go解决“Cracking the Coding interview”一书中的问题6。
注意我不能帮助解决这个问题
给定由NxN矩阵表示的图像,其中图像中的每个像素是4 字节,写一个方法将图像旋转90度。你能这样做吗?
问题:我创建了一个数组数组来表示矩阵,我创建了一个交换函数来在矩阵中顺时针交换元素。出于某种原因,我在尝试编译时遇到了这个非常奇怪的错误:
./Q6.go:29: invalid operation: b[N - col - 1] (index of type *int)
./Q6.go:30: invalid operation: b[N - row - 1] (index of type *int)
我在哪里将type * int作为索引?在Go文档中,len(v)返回int类型,其他所有值为'N-col-1'的类型为int,那么我如何得到type * int index?
代码:
package main
import "fmt"
func main() {
b := [][]int{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}} // 4 by 4 array going from 1 to 16
N := len(b)
for row := 0; row < N / 2; row++ {
for col := row; col < N - row - 1; col++ {
a := &b[row][col]
b := &b[col][N - row - 1]
c := &b[N - col - 1][col] // <-- Error here
d := &b[N - row - 1][N - col - 1] // <-- Error here
fourSwap(a, b, c, d)
}
}
for r := range b {
for c:= range b[0] {
fmt.Print(b[r][c])
}
fmt.Print("\n")
}
}
// [a][-][-][b] [c][-][-][a]
// [-][-][-][-] --> [-][-][-][-]
// [-][-][-][-] --> [-][-][-][-]
// [c][-][-][d] [d][-][-][b]
func fourSwap(a, b, c, d *int) {
temp := *b
*b = *a
*a = *c
*c = *d
*d = temp
}
答案 0 :(得分:2)
你在循环中声明b
,这会影响你的切片。
for row := 0; row < N / 2; row++ {
for col := row; col < N - row - 1; col++ {
a := &b[row][col]
b := &b[col][N - row - 1] <<<< b is now an *int
c := &b[N - col - 1][col] // <-- Error here
d := &b[N - row - 1][N - col - 1] // <-- Error here
fourSwap(a, b, c, d)
}
}
答案 1 :(得分:1)
在创建错误之前,您正在创建一个新的局部变量b,它是行上的指针:
b := &b[col][N - row - 1]