为了账号安全,请及时绑定邮箱和手机立即绑定

如何排除溢出矩阵的坐标

如何排除溢出矩阵的坐标

Go
拉莫斯之舞 2022-12-13 16:05:05
任务是编写一个函数,返回一个元素的所有邻居。对角线元素不被视为邻居。一般来说,问题是解决了,但是如果元素落在矩阵之外,编译器会产生运行时错误:index out of range [-1]。现在我正在考虑制定一个排除矩阵外数据的条件。你能告诉我这样的情况会是什么样子吗?我已经尝试过类似的方法:if element = -1, then remove element from response. 但它不起作用。package mainimport "fmt"func Input(y, x int) []int {    matrix := [][]int{        []int{0, 2, 3},        []int{2, 3, 1},        []int{8, 7, 4},        []int{3, 2, 1},    }    k := []int{matrix[y+1][x], matrix[y-1][x], matrix[y][x+1], matrix[y][x-1]}    for _, z := range k {        if z == -1 { //error            return append(k[z:], k[:z-1]...)        }    }    return k}func main() {    fmt.Println(Input(0, 0))}
查看完整描述

1 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

x邻居的 和索引都y可能超出范围,不仅是在 时-1,而且当它们 >= 您用它们索引的切片的长度时。


所以基本上有 4 个邻居:


(y-1,x), (y+1, x), (y,x-1), (y,x+1)

你必须检查所有越界的情况。您的恐慌发生在线路上k := ...,而不是在for循环内。同样在循环的早期返回将不会处理所有元素,这for从根本上就是错误的。


所以基本上这是你可以做到的:


var result []int


if y > 0 {

    result = append(result, matrix[y-1][x])

}

if y < len(matrix)-1 {

    result = append(result, matrix[y+1][x])

}

if x > 0 {

    result = append(result, matrix[y][x-1])

}

if x < len(matrix[y])-1 {

    result = append(result, matrix[y][x+1])

}


return result

这将输出(在Go Playground上尝试):


[2 2]

注意,如果xory已经无效,上面的代码仍然会 panic。如果你想防止它,你还必须验证xand y,例如:


var result []int

if y < 0 || y >= len(matrix) || x < 0 || x >= len(matrix[y]) {

    return result

}

另一种方法是在另一个切片中列出邻居的deltaY和索引:deltaX


var neighbors = [][]int{

    {-1, 0},

    {1, 0},

    {0, -1},

    {0, 1},

}

您可以使用循环遍历neighbors,然后您可以在一个地方检查索引:


var result []int

for _, neighbor := range neighbors {

    iy, ix := y+neighbor[0], x+neighbor[1]

    if iy < 0 || iy >= len(matrix) || ix < 0 || ix >= len(matrix[iy]) {

        continue

    }

    result = append(result, matrix[iy][ix])

}


return result

在Go Playground试试这个。


请注意,如果您在矩阵外部指定索引,并且该元素的邻居落在矩阵内,则第二个解决方案也会返回邻居。y=-1例如,使用, 作为输入,将返回x=0邻居 (y+1,x) 。0


查看完整回答
反对 回复 2022-12-13
  • 1 回答
  • 0 关注
  • 51 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信