任务是编写一个函数,返回元素的所有邻居.对角线元素不被视为邻居.

一般来说,问题已经解决,但如果元素落在矩阵之外,编译器会生成运行时错误:索引超出范围[-1].现在我想做一个条件,排除矩阵之外的数据.你能告诉我这种情况会是什么样子吗?我已经try 过这样的方法:如果element=-1,那么从响应中删除element.但它不起作用.

package main

import "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))
}

推荐答案

邻居的xy索引都可能超出范围,不仅当它们是-1时,而且当它们是>;=用它们索引的切片长度.

所以基本上有四个邻居:

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

你必须判断所有的越界案件.你的panic 发生在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上try ):

[2 2]

请注意,如果xy已经无效,上述代码仍将死机.如果你想防止它,你还必须验证xy,例如:

var result []int
if y < 0 || y >= len(matrix) || x < 0 || x >= len(matrix[y]) {
    return result
}

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

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=-1x=0作为输入,将返回0的邻居(y+1,x).

Go相关问答推荐

Gorm foreign 密钥

如何使用GRPC UnaryClientInterceptor中的`maily`参数?

macOS上GoLand 2023.3.4中的代码导航

需要类型[]*structpb.Value(GCP Golang客户端库;aiPlatform)

Azure golang SDK - 将 AcrPull 角色分配给 AKS 群集

从 wincrypt API 到 Go 的 RC2 解密

使用Goldmark在golang中添加ChildNode会导致堆栈溢出

Golang - POST 失败(NoSurf CSRF)

我如何使用 TOML fixtures 在使用 Go Buffalo 框架的开发环境中为我的数据库 seeder ?

具有未导出字段的 struct 类型之间的转换

NaN 是 golang 中的可比类型吗?

使用 AppID 在 Windows 中启动应用程序并获取 pid

使用 Golang SQL 驱动程序连接到snowflake

将 Golang Gin 与 AWS Lambda 和无服务器与代理路径一起使用

为什么 x/net/html Token().Attr 上的 len 在此处为空切片返回非零值?

如何在 Windows 上使用 cgo 为 386 arch 构建 lib?

为什么import和ImportSpec之间可以出现多行注释,而PackageName和ImportPath之间不能出现?

GOENV 只能使用 OS 环境设置

为什么 Go 中的 maps.Keys() 将 map 类型指定为 M?

正则表达式处理数字签名的多个条目