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

一般来说,问题已经解决,但如果元素落在矩阵之外,编译器会生成运行时错误:索引超出范围[-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相关问答推荐

使用 bolthold 3 条件进行 boltDB 查询

如何使路径“/”不匹配 Golang net/http 中所有其他不匹配的路径

如何正确判断 io.Reader 是否为零?

如何在 docker 文件中安装 golang 包?

如何从字符串中删除多个换行符`\n`但只保留一个?

gob 解码器仅返回数组中的第一个元素

go 例程和接收错误或成功的通道

Scanner.Buffer - 最大值对自定义拆分没有影响?

gopls 为 github.com/Shopify/sarama 返回错误“gopls: no packages returned: packages.Load error”

如何断言类型是指向golang中接口的指针

Golang 与 Cassandra db 使用 docker-compose:cannot connect (gocql)

Beego - 我需要“context.Context”而不是 Beego 上下文

从 Go 中的标准输入读取一个字符

去更新所有模块

“download and install 32-bit jetbrains runtime”实际上在 IDE GoLand 中做了什么?

在 Go 中读取 CSV 文件

VSCode:无法导入 Golang 包

通过 Go 中的反射检测空值的快速方法

在 go 中复制一个文件夹

如何从 Dep 迁移到 Go 模块