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
- 1 回答
- 0 关注
- 51 浏览
添加回答
举报